]> Cypherpunks.ru repositories - govpn.git/blobdiff - src/cypherpunks.ru/govpn/cmd/govpn-server/tcp.go
Skip possible invalid memory address during the race
[govpn.git] / src / cypherpunks.ru / govpn / cmd / govpn-server / tcp.go
index c36da3fed3ca02f8610a7ff9040b679f3e4b3981..61eb1e07395fcc8b10ddf690d43b706b0f28300b 100644 (file)
@@ -99,10 +99,18 @@ func handleTCP(conn net.Conn) {
                peersByIDLock.RLock()
                addrPrev, exists := peersByID[*peer.ID]
                peersByIDLock.RUnlock()
+               var peerPrev *PeerState
                if exists {
                        peersLock.Lock()
-                       peers[addrPrev].terminator <- struct{}{}
-                       tap = peers[addrPrev].tap
+                       peerPrev = peers[addrPrev]
+                       if peerPrev == nil {
+                               exists = false
+                               peersLock.Unlock()
+                       }
+               }
+               if exists {
+                       peerPrev.terminator <- struct{}{}
+                       tap = peerPrev.tap
                        ps = &PeerState{
                                peer:       peer,
                                tap:        tap,