mirror of
https://github.com/tailscale/tailscale.git
synced 2025-04-16 19:51:41 +00:00
wgengine: fix a data race on StatusCallback
Updates tailscale/tailscale#112 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
parent
c576a57067
commit
19b54d0ae7
@ -29,7 +29,6 @@ import (
|
|||||||
|
|
||||||
type userspaceEngine struct {
|
type userspaceEngine struct {
|
||||||
logf logger.Logf
|
logf logger.Logf
|
||||||
statusCallback StatusCallback
|
|
||||||
reqCh chan struct{}
|
reqCh chan struct{}
|
||||||
waitCh chan struct{}
|
waitCh chan struct{}
|
||||||
tundev tun.Device
|
tundev tun.Device
|
||||||
@ -44,6 +43,7 @@ type userspaceEngine struct {
|
|||||||
lastRoutes string
|
lastRoutes string
|
||||||
|
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
|
statusCallback StatusCallback
|
||||||
peerSequence []wgcfg.Key
|
peerSequence []wgcfg.Key
|
||||||
endpoints []string
|
endpoints []string
|
||||||
pingers map[wgcfg.Key]context.CancelFunc // mu must be held to call CancelFunc
|
pingers map[wgcfg.Key]context.CancelFunc // mu must be held to call CancelFunc
|
||||||
@ -416,9 +416,17 @@ func (e *userspaceEngine) SetFilter(filt *filter.Filter) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (e *userspaceEngine) SetStatusCallback(cb StatusCallback) {
|
func (e *userspaceEngine) SetStatusCallback(cb StatusCallback) {
|
||||||
|
e.mu.Lock()
|
||||||
|
defer e.mu.Unlock()
|
||||||
e.statusCallback = cb
|
e.statusCallback = cb
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (e *userspaceEngine) getStatusCallback() StatusCallback {
|
||||||
|
e.mu.Lock()
|
||||||
|
defer e.mu.Unlock()
|
||||||
|
return e.statusCallback
|
||||||
|
}
|
||||||
|
|
||||||
func (e *userspaceEngine) getStatus() (*Status, error) {
|
func (e *userspaceEngine) getStatus() (*Status, error) {
|
||||||
e.wgLock.Lock()
|
e.wgLock.Lock()
|
||||||
defer e.wgLock.Unlock()
|
defer e.wgLock.Unlock()
|
||||||
@ -543,8 +551,8 @@ func (e *userspaceEngine) RequestStatus() {
|
|||||||
e.logf("RequestStatus: weird: both s and err are nil\n")
|
e.logf("RequestStatus: weird: both s and err are nil\n")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if e.statusCallback != nil {
|
if cb := e.getStatusCallback(); cb != nil {
|
||||||
e.statusCallback(s, err)
|
cb(s, err)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user