X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=src%2Fcypherpunks.ru%2Fgovpn%2Fcmd%2Fgovpn-server%2Fudp.go;h=037351778f566605fcc28733350ac60d663cc978;hb=8cdc4548bc7b6c8b774c2be3b7cd350756df25b6;hp=cdcfb56996cc8492106f3f20797f315d8caa70df;hpb=f47fff1e42f75b736e7067ec06c2e81394833d46;p=govpn.git diff --git a/src/cypherpunks.ru/govpn/cmd/govpn-server/udp.go b/src/cypherpunks.ru/govpn/cmd/govpn-server/udp.go index cdcfb56..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{}) { @@ -196,7 +204,11 @@ func startUDP() { peersLock.Unlock() peersByIDLock.Unlock() kpLock.Unlock() - govpn.Printf(`[peer-created bind="%s" peer="%s"]`, *bindAddr, peer.ID.String()) + govpn.Printf( + `[peer-created bind="%s" peer="%s"]`, + *bindAddr, + peer.ID.String(), + ) }(addr, peer) } udpBufs <- buf