From 2f7e7be2ea98c249dcdecf761ec85359a2d2751f Mon Sep 17 00:00:00 2001 From: Adrian Dewhurst Date: Wed, 20 Mar 2024 11:31:31 -0400 Subject: [PATCH] control/controlclient: do not alias peer CapMap Updates #cleanup Change-Id: I10fd5e04310cdd7894a3caa3045b86eb0a06b6a0 Signed-off-by: Adrian Dewhurst --- control/controlclient/map.go | 5 +++-- control/controlclient/map_test.go | 5 +++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/control/controlclient/map.go b/control/controlclient/map.go index e03e57d7a..31854515f 100644 --- a/control/controlclient/map.go +++ b/control/controlclient/map.go @@ -8,6 +8,7 @@ import ( "context" "encoding/json" "fmt" + "maps" "net" "reflect" "slices" @@ -668,14 +669,14 @@ func peerChangeDiff(was tailcfg.NodeView, n *tailcfg.Node) (_ *tailcfg.PeerChang if n.CapMap == nil { pc().CapMap = make(tailcfg.NodeCapMap) } else { - pc().CapMap = n.CapMap + pc().CapMap = maps.Clone(n.CapMap) } break } was.CapMap().Range(func(k tailcfg.NodeCapability, v views.Slice[tailcfg.RawMessage]) bool { nv, ok := n.CapMap[k] if !ok || !views.SliceEqual(v, views.SliceOf(nv)) { - pc().CapMap = n.CapMap + pc().CapMap = maps.Clone(n.CapMap) return false } return true diff --git a/control/controlclient/map_test.go b/control/controlclient/map_test.go index 817e730ca..c3d05b44a 100644 --- a/control/controlclient/map_test.go +++ b/control/controlclient/map_test.go @@ -865,6 +865,11 @@ func TestPeerChangeDiff(t *testing.T) { a: &tailcfg.Node{ID: 1, CapMap: tailcfg.NodeCapMap{tailcfg.CapabilityAdmin: nil}}, b: &tailcfg.Node{ID: 1, CapMap: tailcfg.NodeCapMap{}}, want: &tailcfg.PeerChange{NodeID: 1, CapMap: tailcfg.NodeCapMap{}}, + }, { + name: "patch-capmap-remove-as-nil", + a: &tailcfg.Node{ID: 1, CapMap: tailcfg.NodeCapMap{tailcfg.CapabilityAdmin: nil}}, + b: &tailcfg.Node{ID: 1}, + want: &tailcfg.PeerChange{NodeID: 1, CapMap: tailcfg.NodeCapMap{}}, }, { name: "patch-capmap-add-key-to-empty-map", a: &tailcfg.Node{ID: 1},