config Config
pruneTimer *time.Timer
extensionBytes peerExtensionBytes
+ // Set of addresses that have our client ID. This intentionally will
+ // include ourselves if we end up trying to connect to our own address
+ // through legitimate channels.
+ dopplegangerAddrs map[string]struct{}
torrentDataOpener TorrentDataOpener
torrentDataOpener: func(md *metainfo.Info) data.Data {
return filePkg.TorrentData(md, cfg.DataDir)
},
+ dopplegangerAddrs: make(map[string]struct{}),
quit: make(chan struct{}),
torrents: make(map[InfoHash]*torrent),
}
acceptedConns.Add(1)
cl.mu.RLock()
+ doppleganger := cl.dopplegangerAddr(conn.RemoteAddr().String())
blockRange := cl.ipBlockRange(AddrIP(conn.RemoteAddr()))
cl.mu.RUnlock()
- if blockRange != nil {
+ if blockRange != nil || doppleganger {
inboundConnsBlocked.Add(1)
// log.Printf("inbound connection from %s blocked by %s", conn.RemoteAddr(), blockRange)
conn.Close()
return
}
+func (me *Client) dopplegangerAddr(addr string) bool {
+ _, ok := me.dopplegangerAddrs[addr]
+ return ok
+}
+
// Start the process of connecting to the given peer for the given torrent if
// appropriate.
func (me *Client) initiateConn(peer Peer, t *torrent) {
return
}
addr := net.JoinHostPort(peer.IP.String(), fmt.Sprintf("%d", peer.Port))
- if t.addrActive(addr) {
+ if me.dopplegangerAddr(addr) || t.addrActive(addr) {
duplicateConnsAvoided.Add(1)
return
}
}
func (me *Client) addPeers(t *torrent, peers []Peer) {
- blocked := 0
for _, p := range peers {
+ if me.dopplegangerAddr(net.JoinHostPort(p.IP.String(), strconv.FormatInt(int64(p.Port), 10))) {
+ continue
+ }
if me.ipBlockRange(p.IP) != nil {
- blocked++
continue
}
t.addPeer(p)
}
- if blocked != 0 {
- log.Printf("IP blocklist screened %d peers from being added", blocked)
- }
me.openNewConns(t)
}