metropolis/clusternet: fix race condition

This gives the wireguard backend a copy of the peer data instead of a
pointer into mutable memory.

Change-Id: I47ee83f3d484cc809c35d2e1779b519ec60c7c78
Reviewed-on: https://review.monogon.dev/c/monogon/+/1825
Tested-by: Jenkins CI
Reviewed-by: Lorenz Brun <lorenz@monogon.tech>
diff --git a/metropolis/node/core/clusternet/clusternet.go b/metropolis/node/core/clusternet/clusternet.go
index dc2de00..dea0f89 100644
--- a/metropolis/node/core/clusternet/clusternet.go
+++ b/metropolis/node/core/clusternet/clusternet.go
@@ -175,14 +175,14 @@
 
 		for _, n := range removed {
 			supervisor.Logger(ctx).Infof("Node %s removed, unconfiguring", n.id)
-			if err := s.wg.unconfigurePeer(n); err != nil {
+			if err := s.wg.unconfigurePeer(n.copy()); err != nil {
 				// Do nothing and hope whatever caused this will go away at some point.
 				supervisor.Logger(ctx).Errorf("Node %s couldn't be unconfigured: %v", n.id, err)
 			}
 		}
 		var newNodes []*node
 		for _, n := range updated {
-			newNodes = append(newNodes, n)
+			newNodes = append(newNodes, n.copy())
 			supervisor.Logger(ctx).Infof("Node %s updated: pk %s, address %s, prefixes %v", n.id, n.pubkey, n.address, n.prefixes)
 		}
 		succeeded := 0