From 8cdc4548bc7b6c8b774c2be3b7cd350756df25b6 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Mon, 3 Apr 2017 23:34:42 +0300 Subject: [PATCH] Skip possible invalid memory address during the race --- src/cypherpunks.ru/govpn/cmd/govpn-server/tcp.go | 12 ++++++++++-- src/cypherpunks.ru/govpn/cmd/govpn-server/udp.go | 12 ++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/cypherpunks.ru/govpn/cmd/govpn-server/tcp.go b/src/cypherpunks.ru/govpn/cmd/govpn-server/tcp.go index c36da3f..61eb1e0 100644 --- a/src/cypherpunks.ru/govpn/cmd/govpn-server/tcp.go +++ b/src/cypherpunks.ru/govpn/cmd/govpn-server/tcp.go @@ -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, diff --git a/src/cypherpunks.ru/govpn/cmd/govpn-server/udp.go b/src/cypherpunks.ru/govpn/cmd/govpn-server/udp.go index dbfc689..0373517 100644 --- a/src/cypherpunks.ru/govpn/cmd/govpn-server/udp.go +++ b/src/cypherpunks.ru/govpn/cmd/govpn-server/udp.go @@ -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{}) { -- 2.44.0