]> Cypherpunks.ru repositories - govpn.git/blobdiff - src/cypherpunks.ru/govpn/cmd/govpn-server/udp.go
Skip possible invalid memory address during the race
[govpn.git] / src / cypherpunks.ru / govpn / cmd / govpn-server / udp.go
index dbfc68948bf22aee00fbcceca90af29d6713aef1..037351778f566605fcc28733350ac60d663cc978 100644 (file)
@@ -136,12 +136,20 @@ func startUDP() {
                        peersByIDLock.RLock()
                        addrPrev, exists = peersByID[*peer.ID]
                        peersByIDLock.RUnlock()
+                       var peerPrev *PeerState
                        if exists {
                                peersLock.Lock()
-                               peers[addrPrev].terminator <- struct{}{}
+                               peerPrev = peers[addrPrev]
+                               if peerPrev == nil {
+                                       exists = false
+                                       peersLock.Unlock()
+                               }
+                       }
+                       if exists {
+                               peerPrev.terminator <- struct{}{}
                                psNew := &PeerState{
                                        peer:       peer,
-                                       tap:        peers[addrPrev].tap,
+                                       tap:        peerPrev.tap,
                                        terminator: make(chan struct{}),
                                }
                                go func(peer *govpn.Peer, tap *govpn.TAP, terminator chan struct{}) {