From 610dbd17ba7310e498031ae492eca0acb4840ad4 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Sat, 14 Apr 2018 21:43:08 +1000 Subject: [PATCH] Fix #244 --- bep40.go | 25 +++++++++++++++++-------- bep40_test.go | 18 +++++++++++------- client.go | 2 +- 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/bep40.go b/bep40.go index b92ef9d9..e7debc74 100644 --- a/bep40.go +++ b/bep40.go @@ -3,6 +3,7 @@ package torrent import ( "bytes" "encoding/binary" + "errors" "fmt" "hash/crc32" @@ -53,30 +54,38 @@ func ipv6Mask(a, b net.IP) net.IPMask { panic(fmt.Sprintf("%s %s", a, b)) } -func bep40PriorityBytes(a, b ipPort) []byte { +func bep40PriorityBytes(a, b ipPort) ([]byte, error) { if a.IP.Equal(b.IP) { var ret [4]byte binary.BigEndian.PutUint16(ret[0:2], a.Port) binary.BigEndian.PutUint16(ret[2:4], b.Port) - return ret[:] + return ret[:], nil } if a4, b4 := a.IP.To4(), b.IP.To4(); a4 != nil && b4 != nil { m := ipv4Mask(a.IP, b.IP) - return append(a4.Mask(m), b4.Mask(m)...) + return append(a4.Mask(m), b4.Mask(m)...), nil } if a6, b6 := a.IP.To16(), b.IP.To16(); a6 != nil && b6 != nil { m := ipv6Mask(a.IP, b.IP) - return append(a6.Mask(m), b6.Mask(m)...) + return append(a6.Mask(m), b6.Mask(m)...), nil } - panic(fmt.Sprintf("%s %s", a.IP, b.IP)) + return nil, errors.New("incomparable IPs") } -func bep40Priority(a, b ipPort) peerPriority { - bs := bep40PriorityBytes(a, b) +func bep40Priority(a, b ipPort) (peerPriority, error) { + bs, err := bep40PriorityBytes(a, b) + if err != nil { + return 0, nil + } i := len(bs) / 2 _a, _b := bs[:i], bs[i:] if bytes.Compare(_a, _b) > 0 { bs = append(_b, _a...) } - return crc32.Checksum(bs, table) + return crc32.Checksum(bs, table), nil +} + +func bep40PriorityIgnoreError(a, b ipPort) peerPriority { + prio, _ := bep40Priority(a, b) + return prio } diff --git a/bep40_test.go b/bep40_test.go index 4c82a5ad..78102149 100644 --- a/bep40_test.go +++ b/bep40_test.go @@ -8,20 +8,24 @@ import ( ) func TestBep40Priority(t *testing.T) { - assert.EqualValues(t, 0xec2d7224, bep40Priority( + assert.EqualValues(t, 0xec2d7224, bep40PriorityIgnoreError( ipPort{net.ParseIP("123.213.32.10"), 0}, ipPort{net.ParseIP("98.76.54.32"), 0}, )) - assert.EqualValues(t, 0xec2d7224, bep40Priority( + assert.EqualValues(t, 0xec2d7224, bep40PriorityIgnoreError( ipPort{net.ParseIP("98.76.54.32"), 0}, ipPort{net.ParseIP("123.213.32.10"), 0}, )) - assert.Equal(t, peerPriority(0x99568189), bep40Priority( + assert.Equal(t, peerPriority(0x99568189), bep40PriorityIgnoreError( ipPort{net.ParseIP("123.213.32.10"), 0}, ipPort{net.ParseIP("123.213.32.234"), 0}, )) - assert.EqualValues(t, "\x00\x00\x00\x00", bep40PriorityBytes( - ipPort{net.ParseIP("123.213.32.234"), 0}, - ipPort{net.ParseIP("123.213.32.234"), 0}, - )) + assert.EqualValues(t, "\x00\x00\x00\x00", func() []byte { + b, _ := bep40PriorityBytes( + ipPort{net.ParseIP("123.213.32.234"), 0}, + ipPort{net.ParseIP("123.213.32.234"), 0}, + ) + return b + }()) + } diff --git a/client.go b/client.go index 7ea276d8..a07e3dac 100644 --- a/client.go +++ b/client.go @@ -945,7 +945,7 @@ func (cl *Client) newTorrent(ih metainfo.Hash, specStorage storage.ClientImpl) ( peers: prioritizedPeers{ om: btree.New(2), getPrio: func(p Peer) peerPriority { - return bep40Priority(cl.publicAddr(p.IP), p.addr()) + return bep40PriorityIgnoreError(cl.publicAddr(p.IP), p.addr()) }, }, conns: make(map[*connection]struct{}, 2*cl.config.EstablishedConnsPerTorrent), -- 2.44.0