From 1375b0e37ff52a68a83df4871f14a6e439fcf5b5 Mon Sep 17 00:00:00 2001
From: Viktor Liu <viktor@netbird.io>
Date: Thu, 9 Jan 2025 11:51:34 +0100
Subject: [PATCH] Prevent local routes in status from being overridden by
 updates

---
 client/internal/engine.go      | 13 +++++++------
 client/internal/peer/status.go |  8 +++++++-
 2 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/client/internal/engine.go b/client/internal/engine.go
index 7b6f269df48..b50532b7de4 100644
--- a/client/internal/engine.go
+++ b/client/internal/engine.go
@@ -763,12 +763,13 @@ func (e *Engine) updateConfig(conf *mgmProto.PeerConfig) error {
 		}
 	}
 
-	e.statusRecorder.UpdateLocalPeerState(peer.LocalPeerState{
-		IP:              e.config.WgAddr,
-		PubKey:          e.config.WgPrivateKey.PublicKey().String(),
-		KernelInterface: device.WireGuardModuleIsLoaded(),
-		FQDN:            conf.GetFqdn(),
-	})
+	state := e.statusRecorder.GetLocalPeerState()
+	state.IP = e.config.WgAddr
+	state.PubKey = e.config.WgPrivateKey.PublicKey().String()
+	state.KernelInterface = device.WireGuardModuleIsLoaded()
+	state.FQDN = conf.GetFqdn()
+
+	e.statusRecorder.UpdateLocalPeerState(state)
 
 	return nil
 }
diff --git a/client/internal/peer/status.go b/client/internal/peer/status.go
index dc461257adf..0df2a2e81d7 100644
--- a/client/internal/peer/status.go
+++ b/client/internal/peer/status.go
@@ -84,6 +84,12 @@ type LocalPeerState struct {
 	Routes          map[string]struct{}
 }
 
+// Clone returns a copy of the LocalPeerState
+func (l LocalPeerState) Clone() LocalPeerState {
+	l.Routes = maps.Clone(l.Routes)
+	return l
+}
+
 // SignalState contains the latest state of a signal connection
 type SignalState struct {
 	URL       string
@@ -501,7 +507,7 @@ func (d *Status) GetPeerStateChangeNotifier(peer string) <-chan struct{} {
 func (d *Status) GetLocalPeerState() LocalPeerState {
 	d.mux.Lock()
 	defer d.mux.Unlock()
-	return d.localPeer
+	return d.localPeer.Clone()
 }
 
 // UpdateLocalPeerState updates local peer status