From 1b975be057fc02848d205361bdc5426110b99930 Mon Sep 17 00:00:00 2001 From: Dawn Minion Date: Tue, 3 Oct 2023 14:56:26 -0700 Subject: [PATCH] Fix data race in newWatchEventPeer This method was attempting to read from peer.fsm before acquiring a read lock, leading to a data race as this struct is written by a different goroutine in parallel. Commit moves the call to RLock before the first read from the struct. --- pkg/server/server.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/server/server.go b/pkg/server/server.go index 2b3cbcb02..be1ef2619 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -915,12 +915,13 @@ func (s *BgpServer) notifyPostPolicyUpdateWatcher(peer *peer, pathList []*table. func newWatchEventPeer(peer *peer, m *fsmMsg, oldState bgp.FSMState, t PeerEventType) *watchEventPeer { var laddr string var rport, lport uint16 + + peer.fsm.lock.RLock() if peer.fsm.conn != nil { _, rport = peer.fsm.RemoteHostPort() laddr, lport = peer.fsm.LocalHostPort() } sentOpen := buildopen(peer.fsm.gConf, peer.fsm.pConf) - peer.fsm.lock.RLock() recvOpen := peer.fsm.recvOpen e := &watchEventPeer{ Type: t,