From fa7767e612f60ced85ca60ad290084512f88d27a Mon Sep 17 00:00:00 2001 From: Maycon Santos Date: Sun, 15 Sep 2024 16:07:26 +0200 Subject: [PATCH] Fix get management and signal state race condition (#2570) * Fix get management and signal state race condition * fix get full status lock --- client/internal/peer/status.go | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/client/internal/peer/status.go b/client/internal/peer/status.go index f116f3fef..915fa63f0 100644 --- a/client/internal/peer/status.go +++ b/client/internal/peer/status.go @@ -597,6 +597,8 @@ func (d *Status) DeleteResolvedDomainsStates(domain domain.Domain) { } func (d *Status) GetRosenpassState() RosenpassState { + d.mux.Lock() + defer d.mux.Unlock() return RosenpassState{ d.rosenpassEnabled, d.rosenpassPermissive, @@ -604,6 +606,8 @@ func (d *Status) GetRosenpassState() RosenpassState { } func (d *Status) GetManagementState() ManagementState { + d.mux.Lock() + defer d.mux.Unlock() return ManagementState{ d.mgmAddress, d.managementState, @@ -645,6 +649,8 @@ func (d *Status) IsLoginRequired() bool { } func (d *Status) GetSignalState() SignalState { + d.mux.Lock() + defer d.mux.Unlock() return SignalState{ d.signalAddress, d.signalState, @@ -654,6 +660,8 @@ func (d *Status) GetSignalState() SignalState { // GetRelayStates returns the stun/turn/permanent relay states func (d *Status) GetRelayStates() []relay.ProbeResult { + d.mux.Lock() + defer d.mux.Unlock() if d.relayMgr == nil { return d.relayStates } @@ -684,6 +692,8 @@ func (d *Status) GetRelayStates() []relay.ProbeResult { } func (d *Status) GetDNSStates() []NSGroupState { + d.mux.Lock() + defer d.mux.Unlock() return d.nsGroupStates } @@ -695,18 +705,19 @@ func (d *Status) GetResolvedDomainsStates() map[domain.Domain][]netip.Prefix { // GetFullStatus gets full status func (d *Status) GetFullStatus() FullStatus { - d.mux.Lock() - defer d.mux.Unlock() - fullStatus := FullStatus{ ManagementState: d.GetManagementState(), SignalState: d.GetSignalState(), - LocalPeerState: d.localPeer, Relays: d.GetRelayStates(), RosenpassState: d.GetRosenpassState(), NSGroupStates: d.GetDNSStates(), } + d.mux.Lock() + defer d.mux.Unlock() + + fullStatus.LocalPeerState = d.localPeer + for _, status := range d.peers { fullStatus.Peers = append(fullStatus.Peers, status) }