Pull request: safebrowsing races
Merge in DNS/adguard-home from safebrowsing-races to master Squashed commit of the following: commit c7f4932d1ed8ea4fea99e04487ac77c23fb5f386 Author: Eugene Burkov <E.Burkov@AdGuard.COM> Date: Thu Jan 26 16:36:32 2023 +0300 filtering: imp code, naming commit af83cf2e689d199c8280022c9ffb84775b74c4e4 Author: Eugene Burkov <E.Burkov@AdGuard.COM> Date: Wed Jan 25 19:47:30 2023 +0300 filtering: DRY commit 8bfe6b2bb397058af3b7de4d255ed13287e250c9 Author: Eugene Burkov <E.Burkov@AdGuard.COM> Date: Wed Jan 25 18:48:19 2023 +0300 filtering: fix possible races
This commit is contained in:
parent
99ec1d840c
commit
6aa93f4ae7
|
@ -22,6 +22,7 @@ import (
|
||||||
"github.com/AdguardTeam/golibs/cache"
|
"github.com/AdguardTeam/golibs/cache"
|
||||||
"github.com/AdguardTeam/golibs/errors"
|
"github.com/AdguardTeam/golibs/errors"
|
||||||
"github.com/AdguardTeam/golibs/log"
|
"github.com/AdguardTeam/golibs/log"
|
||||||
|
"github.com/AdguardTeam/golibs/mathutil"
|
||||||
"github.com/AdguardTeam/golibs/stringutil"
|
"github.com/AdguardTeam/golibs/stringutil"
|
||||||
"github.com/AdguardTeam/urlfilter"
|
"github.com/AdguardTeam/urlfilter"
|
||||||
"github.com/AdguardTeam/urlfilter/filterlist"
|
"github.com/AdguardTeam/urlfilter/filterlist"
|
||||||
|
@ -287,12 +288,7 @@ func (r Reason) In(reasons ...Reason) (ok bool) { return slices.Contains(reasons
|
||||||
|
|
||||||
// SetEnabled sets the status of the *DNSFilter.
|
// SetEnabled sets the status of the *DNSFilter.
|
||||||
func (d *DNSFilter) SetEnabled(enabled bool) {
|
func (d *DNSFilter) SetEnabled(enabled bool) {
|
||||||
var i int32
|
atomic.StoreUint32(&d.enabled, mathutil.BoolToNumber[uint32](enabled))
|
||||||
if enabled {
|
|
||||||
i = 1
|
|
||||||
}
|
|
||||||
|
|
||||||
atomic.StoreUint32(&d.enabled, uint32(i))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetConfig - get configuration
|
// GetConfig - get configuration
|
||||||
|
|
|
@ -10,6 +10,7 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/aghhttp"
|
"github.com/AdguardTeam/AdGuardHome/internal/aghhttp"
|
||||||
|
@ -369,13 +370,35 @@ func (d *DNSFilter) checkParental(
|
||||||
return check(sctx, res, d.parentalUpstream)
|
return check(sctx, res, d.parentalUpstream)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// setProtectedBool sets the value of a boolean pointer under a lock. l must
|
||||||
|
// protect the value under ptr.
|
||||||
|
//
|
||||||
|
// TODO(e.burkov): Make it generic?
|
||||||
|
func setProtectedBool(mu *sync.RWMutex, ptr *bool, val bool) {
|
||||||
|
mu.Lock()
|
||||||
|
defer mu.Unlock()
|
||||||
|
|
||||||
|
*ptr = val
|
||||||
|
}
|
||||||
|
|
||||||
|
// protectedBool gets the value of a boolean pointer under a read lock. l must
|
||||||
|
// protect the value under ptr.
|
||||||
|
//
|
||||||
|
// TODO(e.burkov): Make it generic?
|
||||||
|
func protectedBool(mu *sync.RWMutex, ptr *bool) (val bool) {
|
||||||
|
mu.RLock()
|
||||||
|
defer mu.RUnlock()
|
||||||
|
|
||||||
|
return *ptr
|
||||||
|
}
|
||||||
|
|
||||||
func (d *DNSFilter) handleSafeBrowsingEnable(w http.ResponseWriter, r *http.Request) {
|
func (d *DNSFilter) handleSafeBrowsingEnable(w http.ResponseWriter, r *http.Request) {
|
||||||
d.Config.SafeBrowsingEnabled = true
|
setProtectedBool(&d.confLock, &d.Config.SafeBrowsingEnabled, true)
|
||||||
d.Config.ConfigModified()
|
d.Config.ConfigModified()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSFilter) handleSafeBrowsingDisable(w http.ResponseWriter, r *http.Request) {
|
func (d *DNSFilter) handleSafeBrowsingDisable(w http.ResponseWriter, r *http.Request) {
|
||||||
d.Config.SafeBrowsingEnabled = false
|
setProtectedBool(&d.confLock, &d.Config.SafeBrowsingEnabled, false)
|
||||||
d.Config.ConfigModified()
|
d.Config.ConfigModified()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -383,19 +406,19 @@ func (d *DNSFilter) handleSafeBrowsingStatus(w http.ResponseWriter, r *http.Requ
|
||||||
resp := &struct {
|
resp := &struct {
|
||||||
Enabled bool `json:"enabled"`
|
Enabled bool `json:"enabled"`
|
||||||
}{
|
}{
|
||||||
Enabled: d.Config.SafeBrowsingEnabled,
|
Enabled: protectedBool(&d.confLock, &d.Config.SafeBrowsingEnabled),
|
||||||
}
|
}
|
||||||
|
|
||||||
_ = aghhttp.WriteJSONResponse(w, r, resp)
|
_ = aghhttp.WriteJSONResponse(w, r, resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSFilter) handleParentalEnable(w http.ResponseWriter, r *http.Request) {
|
func (d *DNSFilter) handleParentalEnable(w http.ResponseWriter, r *http.Request) {
|
||||||
d.Config.ParentalEnabled = true
|
setProtectedBool(&d.confLock, &d.Config.ParentalEnabled, true)
|
||||||
d.Config.ConfigModified()
|
d.Config.ConfigModified()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSFilter) handleParentalDisable(w http.ResponseWriter, r *http.Request) {
|
func (d *DNSFilter) handleParentalDisable(w http.ResponseWriter, r *http.Request) {
|
||||||
d.Config.ParentalEnabled = false
|
setProtectedBool(&d.confLock, &d.Config.ParentalEnabled, false)
|
||||||
d.Config.ConfigModified()
|
d.Config.ConfigModified()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -403,7 +426,7 @@ func (d *DNSFilter) handleParentalStatus(w http.ResponseWriter, r *http.Request)
|
||||||
resp := &struct {
|
resp := &struct {
|
||||||
Enabled bool `json:"enabled"`
|
Enabled bool `json:"enabled"`
|
||||||
}{
|
}{
|
||||||
Enabled: d.Config.ParentalEnabled,
|
Enabled: protectedBool(&d.confLock, &d.Config.ParentalEnabled),
|
||||||
}
|
}
|
||||||
|
|
||||||
_ = aghhttp.WriteJSONResponse(w, r, resp)
|
_ = aghhttp.WriteJSONResponse(w, r, resp)
|
||||||
|
|
|
@ -135,12 +135,12 @@ func (d *DNSFilter) checkSafeSearch(
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSFilter) handleSafeSearchEnable(w http.ResponseWriter, r *http.Request) {
|
func (d *DNSFilter) handleSafeSearchEnable(w http.ResponseWriter, r *http.Request) {
|
||||||
d.Config.SafeSearchEnabled = true
|
setProtectedBool(&d.confLock, &d.Config.SafeSearchEnabled, true)
|
||||||
d.Config.ConfigModified()
|
d.Config.ConfigModified()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSFilter) handleSafeSearchDisable(w http.ResponseWriter, r *http.Request) {
|
func (d *DNSFilter) handleSafeSearchDisable(w http.ResponseWriter, r *http.Request) {
|
||||||
d.Config.SafeSearchEnabled = false
|
setProtectedBool(&d.confLock, &d.Config.SafeSearchEnabled, false)
|
||||||
d.Config.ConfigModified()
|
d.Config.ConfigModified()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,7 +148,7 @@ func (d *DNSFilter) handleSafeSearchStatus(w http.ResponseWriter, r *http.Reques
|
||||||
resp := &struct {
|
resp := &struct {
|
||||||
Enabled bool `json:"enabled"`
|
Enabled bool `json:"enabled"`
|
||||||
}{
|
}{
|
||||||
Enabled: d.Config.SafeSearchEnabled,
|
Enabled: protectedBool(&d.confLock, &d.Config.SafeSearchEnabled),
|
||||||
}
|
}
|
||||||
|
|
||||||
_ = aghhttp.WriteJSONResponse(w, r, resp)
|
_ = aghhttp.WriteJSONResponse(w, r, resp)
|
||||||
|
|
Loading…
Reference in New Issue