summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@tailscale.com>2022-09-18 07:56:40 -0700
committerBrad Fitzpatrick <brad@danga.com>2022-09-18 08:07:57 -0700
commit832031d54bedecb067200a3ccb85e4601101fd03 (patch)
tree2daf694b00c4bf3961289fd0e8f94e1a9c808cd8
parent42f1d92ae020cf44f10be1a51b0059b46a21478b (diff)
downloadtailscale-832031d54bedecb067200a3ccb85e4601101fd03.tar.xz
tailscale-832031d54bedecb067200a3ccb85e4601101fd03.zip
wgengine/magicsock: fix recently introduced data race
From 5c42990c2fc019, not yet released in a stable build. Caught by existing tests. Fixes #5685 Change-Id: Ia76bb328809d9644e8b96910767facf627830600 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
-rw-r--r--wgengine/magicsock/magicsock.go9
1 files changed, 5 insertions, 4 deletions
diff --git a/wgengine/magicsock/magicsock.go b/wgengine/magicsock/magicsock.go
index 4bf8dae1f..74e279128 100644
--- a/wgengine/magicsock/magicsock.go
+++ b/wgengine/magicsock/magicsock.go
@@ -2366,8 +2366,7 @@ func (c *Conn) SetNetworkMap(nm *netmap.NetworkMap) {
for _, n := range nm.Peers {
if ep, ok := c.peerMap.endpointForNodeKey(n.Key); ok {
oldDiscoKey := ep.discoKey
- ep.heartbeatDisabled = heartbeatDisabled
- ep.updateFromNode(n)
+ ep.updateFromNode(n, heartbeatDisabled)
c.peerMap.upsertEndpoint(ep, oldDiscoKey) // maybe update discokey mappings in peerMap
continue
}
@@ -2410,7 +2409,7 @@ func (c *Conn) SetNetworkMap(nm *netmap.NetworkMap) {
}
}))
}
- ep.updateFromNode(n)
+ ep.updateFromNode(n, heartbeatDisabled)
c.peerMap.upsertEndpoint(ep, key.DiscoPublic{})
}
@@ -3762,13 +3761,15 @@ func (de *endpoint) sendPingsLocked(now mono.Time, sendCallMeMaybe bool) {
}
}
-func (de *endpoint) updateFromNode(n *tailcfg.Node) {
+func (de *endpoint) updateFromNode(n *tailcfg.Node, heartbeatDisabled bool) {
if n == nil {
panic("nil node when updating disco ep")
}
de.mu.Lock()
defer de.mu.Unlock()
+ de.heartbeatDisabled = heartbeatDisabled
+
if de.discoKey != n.DiscoKey {
de.c.logf("[v1] magicsock: disco: node %s changed from discokey %s to %s", de.publicKey.ShortString(), de.discoKey, n.DiscoKey)
de.discoKey = n.DiscoKey