From 88d21ce627f0aabd9d1e336ef42e08354c1044d8 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Tue, 17 May 2016 16:06:18 +1000 Subject: [PATCH] dht: Don't contact nodes with an IP containing a leading octet of 0 --- dht/announce.go | 14 ++++++++++++-- dht/dht_test.go | 8 ++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/dht/announce.go b/dht/announce.go index ead301a4..c6b64579 100644 --- a/dht/announce.go +++ b/dht/announce.go @@ -115,10 +115,20 @@ func (s *Server) Announce(infoHash string, port int, impliedPort bool) (*Announc return disc, nil } +func validNodeAddr(addr Addr) bool { + ua := addr.UDPAddr() + if ua.Port == 0 { + return false + } + if ip4 := ua.IP.To4(); ip4 != nil && ip4[0] == 0 { + return false + } + return true +} + // TODO: Merge this with maybeGetPeersFromAddr. func (a *Announce) gotNodeAddr(addr Addr) { - if addr.UDPAddr().Port == 0 { - // Not a contactable address. + if !validNodeAddr(addr) { return } if a.triedAddrs.Test([]byte(addr.String())) { diff --git a/dht/dht_test.go b/dht/dht_test.go index 166e8f0c..6ed8c4aa 100644 --- a/dht/dht_test.go +++ b/dht/dht_test.go @@ -221,3 +221,11 @@ func TestHook(t *testing.T) { } } } + +// Check that address resolution doesn't rat out invalid SendTo addr +// arguments. +func TestResolveBadAddr(t *testing.T) { + ua, err := net.ResolveUDPAddr("udp", "0.131.255.145:33085") + require.NoError(t, err) + assert.False(t, validNodeAddr(NewAddr(ua))) +} -- 2.48.1