Skip to content

Commit

Permalink
p2p: fix goroutine leak for invalid peers
Browse files Browse the repository at this point in the history
The deflect logic called Disconnect on the peer, but the peer never ran
and wouldn't process the disconnect request.
  • Loading branch information
fjl committed Feb 13, 2015
1 parent 5110f80 commit 22ee366
Showing 1 changed file with 5 additions and 6 deletions.
11 changes: 5 additions & 6 deletions p2p/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -351,19 +351,21 @@ func (srv *Server) startPeer(conn net.Conn, dest *discover.Node) {
srvlog.Debugf("Encryption Handshake with %v failed: %v", conn.RemoteAddr(), err)
return
}

ourID := srv.ntab.Self()
p := newPeer(conn, srv.Protocols, srv.Name, &ourID, &remoteID)
if ok, reason := srv.addPeer(remoteID, p); !ok {
p.Disconnect(reason)
srvlog.DebugDetailf("Not adding %v (%v)\n", p, reason)
p.politeDisconnect(reason)
return
}
srvlog.Debugf("Added %v\n", p)

if srv.newPeerHook != nil {
srv.newPeerHook(p)
}
p.run()
discreason := p.run()
srv.removePeer(p)
srvlog.Debugf("Removed %v (%v)\n", p, discreason)
}

func (srv *Server) addPeer(id discover.NodeID, p *Peer) (bool, DiscReason) {
Expand All @@ -381,14 +383,11 @@ func (srv *Server) addPeer(id discover.NodeID, p *Peer) (bool, DiscReason) {
case id == srv.ntab.Self():
return false, DiscSelf
}
srvlog.Debugf("Adding %v\n", p)
srv.peers[id] = p
return true, 0
}

// removes peer: sending disconnect msg, stop peer, remove rom list/table, release slot
func (srv *Server) removePeer(p *Peer) {
srvlog.Debugf("Removing %v\n", p)
srv.lock.Lock()
delete(srv.peers, *p.remoteID)
srv.lock.Unlock()
Expand Down

0 comments on commit 22ee366

Please sign in to comment.