diff --git a/wgengine/magicsock/magicsock.go b/wgengine/magicsock/magicsock.go index 84bcec867..a264abaa5 100644 --- a/wgengine/magicsock/magicsock.go +++ b/wgengine/magicsock/magicsock.go @@ -168,16 +168,14 @@ func (m *peerMap) forEachEndpointWithDiscoKey(dk key.DiscoPublic, f func(ep *end // upsertEndpoint stores endpoint in the peerInfo for // ep.publicKey, and updates indexes. m must already have a // tailcfg.Node for ep.publicKey. -func (m *peerMap) upsertEndpoint(ep *endpoint) { +func (m *peerMap) upsertEndpoint(ep *endpoint, oldDiscoKey key.DiscoPublic) { pi := m.byNodeKey[ep.publicKey] if pi == nil { pi = newPeerInfo(ep) m.byNodeKey[ep.publicKey] = pi } else { - old := pi.ep - pi.ep = ep - if old.discoKey != ep.discoKey { - delete(m.nodesOfDisco[old.discoKey], ep.publicKey) + if oldDiscoKey != ep.discoKey { + delete(m.nodesOfDisco[oldDiscoKey], ep.publicKey) } } if !ep.discoKey.IsZero() { @@ -2306,8 +2304,9 @@ func (c *Conn) SetNetworkMap(nm *netmap.NetworkMap) { // handle full set updates. for _, n := range nm.Peers { if ep, ok := c.peerMap.endpointForNodeKey(n.Key); ok { + oldDiscoKey := ep.discoKey ep.updateFromNode(n) - c.peerMap.upsertEndpoint(ep) // maybe update discokey mappings in peerMap + c.peerMap.upsertEndpoint(ep, oldDiscoKey) // maybe update discokey mappings in peerMap continue } @@ -2347,7 +2346,7 @@ func (c *Conn) SetNetworkMap(nm *netmap.NetworkMap) { } })) ep.updateFromNode(n) - c.peerMap.upsertEndpoint(ep) + c.peerMap.upsertEndpoint(ep, key.DiscoPublic{}) } // If the set of nodes changed since the last SetNetworkMap, the diff --git a/wgengine/magicsock/magicsock_test.go b/wgengine/magicsock/magicsock_test.go index 4a08b555d..ef094b3a2 100644 --- a/wgengine/magicsock/magicsock_test.go +++ b/wgengine/magicsock/magicsock_test.go @@ -1142,7 +1142,7 @@ func TestDiscoMessage(t *testing.T) { c.peerMap.upsertEndpoint(&endpoint{ publicKey: n.Key, discoKey: n.DiscoKey, - }) + }, key.DiscoPublic{}) const payload = "why hello"