]> Cypherpunks.ru repositories - govpn.git/commitdiff
Skip possible invalid memory address during the race
authorSergey Matveev <stargrave@stargrave.org>
Mon, 3 Apr 2017 20:34:42 +0000 (23:34 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Mon, 3 Apr 2017 21:31:43 +0000 (00:31 +0300)
src/cypherpunks.ru/govpn/cmd/govpn-server/tcp.go
src/cypherpunks.ru/govpn/cmd/govpn-server/udp.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,
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{}) {