From 5acae6e204ab3f5d92449c1231dee754c1db9abb Mon Sep 17 00:00:00 2001 From: Ainar Garipov Date: Mon, 17 May 2021 16:50:02 +0300 Subject: [PATCH] Pull request: all: fix some races Updates #3087. Squashed commit of the following: commit e888ce524f286f3c34e14e0086336b65a95fa020 Author: Ainar Garipov Date: Mon May 17 16:34:10 2021 +0300 all: fix some races --- CHANGELOG.md | 3 ++- go.mod | 2 +- go.sum | 4 ++-- internal/home/control.go | 23 +++++++++++++++-------- internal/home/dns.go | 3 +++ internal/home/i18n.go | 8 +++++++- 6 files changed, 30 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c6c2106b..88f44aaa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,7 @@ and this project adheres to --> ### Added @@ -25,6 +25,7 @@ and this project adheres to ### Fixed +- Intermittent "Warning: ID mismatch" errors ([#3087]). - Error when using installation script on some ARMv7 devices ([#2542]). - DHCP leases validation ([#3107], [#3127]). - Local PTR request recursion in Docker containers ([#3064]). diff --git a/go.mod b/go.mod index 6a527654..d3c5ff42 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/AdguardTeam/AdGuardHome go 1.15 require ( - github.com/AdguardTeam/dnsproxy v0.37.2 + github.com/AdguardTeam/dnsproxy v0.37.4 github.com/AdguardTeam/golibs v0.4.5 github.com/AdguardTeam/urlfilter v0.14.5 github.com/NYTimes/gziphandler v1.1.1 diff --git a/go.sum b/go.sum index c692063f..5008fb0f 100644 --- a/go.sum +++ b/go.sum @@ -20,8 +20,8 @@ dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/AdguardTeam/dhcp v0.0.0-20210517101438-550ef4cd8c6e h1:M6YnFP12o0/SjBEPt6b2r8ZkIy/wsV14TK8X9Tb6DEE= github.com/AdguardTeam/dhcp v0.0.0-20210517101438-550ef4cd8c6e/go.mod h1:TKl4jN3Voofo4UJIicyNhWGp/nlQqQkFxmwIFTvBkKI= -github.com/AdguardTeam/dnsproxy v0.37.2 h1:3lgizD+lZI6uqxFiQykd1/hV7Ji4vSJBMejl1rbFAXU= -github.com/AdguardTeam/dnsproxy v0.37.2/go.mod h1:xkJWEuTr550gPDmB9azsciKZzSXjf9wMn+Ji54PQ4gE= +github.com/AdguardTeam/dnsproxy v0.37.4 h1:YIoJkIp828LKmmmgxXvZHUKfGLsqTQAK8g+4DXbDbyU= +github.com/AdguardTeam/dnsproxy v0.37.4/go.mod h1:xkJWEuTr550gPDmB9azsciKZzSXjf9wMn+Ji54PQ4gE= github.com/AdguardTeam/golibs v0.4.0/go.mod h1:skKsDKIBB7kkFflLJBpfGX+G8QFTx0WKUzB6TIgtUj4= github.com/AdguardTeam/golibs v0.4.2/go.mod h1:skKsDKIBB7kkFflLJBpfGX+G8QFTx0WKUzB6TIgtUj4= github.com/AdguardTeam/golibs v0.4.4/go.mod h1:skKsDKIBB7kkFflLJBpfGX+G8QFTx0WKUzB6TIgtUj4= diff --git a/internal/home/control.go b/internal/home/control.go index 3a9efa1b..54ba69fd 100644 --- a/internal/home/control.go +++ b/internal/home/control.go @@ -133,14 +133,21 @@ func handleStatus(w http.ResponseWriter, _ *http.Request) { return } - resp := statusResponse{ - DNSAddrs: dnsAddrs, - DNSPort: config.DNS.Port, - HTTPPort: config.BindPort, - IsRunning: isRunning(), - Version: version.Version(), - Language: config.Language, - } + var resp statusResponse + + func() { + config.RLock() + defer config.RUnlock() + + resp = statusResponse{ + DNSAddrs: dnsAddrs, + DNSPort: config.DNS.Port, + HTTPPort: config.BindPort, + IsRunning: isRunning(), + Version: version.Version(), + Language: config.Language, + } + }() var c *dnsforward.FilteringConfig if Context.dnsServer != nil { diff --git a/internal/home/dns.go b/internal/home/dns.go index 0e276091..8fa3031c 100644 --- a/internal/home/dns.go +++ b/internal/home/dns.go @@ -319,6 +319,9 @@ func applyAdditionalFiltering(clientAddr net.IP, clientID string, setts *dnsfilt } func startDNSServer() error { + config.Lock() + defer config.Unlock() + if isRunning() { return fmt.Errorf("unable to start forwarding DNS server: Already running") } diff --git a/internal/home/i18n.go b/internal/home/i18n.go index 623cdef6..6b464d8c 100644 --- a/internal/home/i18n.go +++ b/internal/home/i18n.go @@ -86,7 +86,13 @@ func handleI18nChangeLanguage(w http.ResponseWriter, r *http.Request) { return } - config.Language = language + func() { + config.Lock() + defer config.Unlock() + + config.Language = language + }() + onConfigModified() returnOK(w) }