diff --git a/wgengine/userspace.go b/wgengine/userspace.go index 9fd98bdf4..1504873dc 100644 --- a/wgengine/userspace.go +++ b/wgengine/userspace.go @@ -28,25 +28,25 @@ import ( ) type userspaceEngine struct { - logf logger.Logf - statusCallback StatusCallback - reqCh chan struct{} - waitCh chan struct{} - tundev tun.Device - wgdev *device.Device - router Router - magicConn *magicsock.Conn - linkMon *monitor.Mon + logf logger.Logf + reqCh chan struct{} + waitCh chan struct{} + tundev tun.Device + wgdev *device.Device + router Router + magicConn *magicsock.Conn + linkMon *monitor.Mon wgLock sync.Mutex // serializes all wgdev operations lastReconfig string lastCfg wgcfg.Config lastRoutes string - mu sync.Mutex - peerSequence []wgcfg.Key - endpoints []string - pingers map[wgcfg.Key]context.CancelFunc // mu must be held to call CancelFunc + mu sync.Mutex + statusCallback StatusCallback + peerSequence []wgcfg.Key + endpoints []string + pingers map[wgcfg.Key]context.CancelFunc // mu must be held to call CancelFunc } type Loggify struct { @@ -416,9 +416,17 @@ func (e *userspaceEngine) SetFilter(filt *filter.Filter) { } func (e *userspaceEngine) SetStatusCallback(cb StatusCallback) { + e.mu.Lock() + defer e.mu.Unlock() e.statusCallback = cb } +func (e *userspaceEngine) getStatusCallback() StatusCallback { + e.mu.Lock() + defer e.mu.Unlock() + return e.statusCallback +} + func (e *userspaceEngine) getStatus() (*Status, error) { e.wgLock.Lock() defer e.wgLock.Unlock() @@ -543,8 +551,8 @@ func (e *userspaceEngine) RequestStatus() { e.logf("RequestStatus: weird: both s and err are nil\n") return } - if e.statusCallback != nil { - e.statusCallback(s, err) + if cb := e.getStatusCallback(); cb != nil { + cb(s, err) } default: }