p2p: fix goroutine leak for invalid peers

The deflect logic called Disconnect on the peer, but the peer never ran
and wouldn't process the disconnect request.
poc8
Felix Lange 10 years ago
parent 5110f80bba
commit 22ee366ed6
  1. 11
      p2p/server.go

@ -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) {
@ -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()

Loading…
Cancel
Save