torrent.go | 21 +++++++++++---------- diff --git a/torrent.go b/torrent.go index 4db2eb3133e79c6f61815766b9051a9821b6af1c..6da9d46a704e24e6d28283d9955a7a817bb6a551 100644 --- a/torrent.go +++ b/torrent.go @@ -1305,20 +1305,21 @@ return false } for c0 := range t.conns { if c.PeerID == c0.PeerID { - // Retain the connection from lower peer ID to higher. + // Already connected to a client with that ID. + duplicateClientConns.Add(1) lower := string(t.cl.peerID[:]) < string(c.PeerID[:]) - if (outgoing && lower) || (!outgoing && !lower) { + // Retain the connection from initiated from lower peer ID to + // higher. + if outgoing == lower { + // Close the other one. c0.Close() + // Is it safe to delete from the map while we're iterating + // over it? t.deleteConnection(c0) - duplicateClientConns.Add(1) - log.Printf("Drop connection: %s, %s, %s", t.name(), c0.localAddr(), c0.remoteAddr()) - continue + } else { + // Abandon this one. + return false } - - // Already connected to a client with that ID. - duplicateClientConns.Add(1) - log.Printf("Drop connection: %s, %s, %s", t.name(), c.localAddr(), c.remoteAddr()) - return false } } if len(t.conns) >= t.maxEstablishedConns {