]> Sergey Matveev's repositories - btrtrc.git/commitdiff
dht: Don't contact nodes with an IP containing a leading octet of 0
authorMatt Joiner <anacrolix@gmail.com>
Tue, 17 May 2016 06:06:18 +0000 (16:06 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Tue, 17 May 2016 06:06:18 +0000 (16:06 +1000)
dht/announce.go
dht/dht_test.go

index ead301a451b486a46be2cebb292b23cb020377b8..c6b64579be850e5369df40d0a5d64922d617496d 100644 (file)
@@ -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())) {
index 166e8f0cf4a7e3ed5d71981e7b6cd8ff901769e9..6ed8c4aacc0efebdf5c268f3e36f13bb54c81290 100644 (file)
@@ -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)))
+}