From 6ef4495a8fbda46c888b8f746fa006b0dfcdcc4f Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 13 Jul 2020 22:25:45 +0200 Subject: [PATCH] p2p/discover: require table nodes to have an IP (#21330) This fixes a corner case in discv5. The issue cannot happen in discv4 because it performs IP checks on all incoming node information. --- p2p/discover/table.go | 3 +++ p2p/discover/table_test.go | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/p2p/discover/table.go b/p2p/discover/table.go index 6d48ab00cd..010fa47f52 100644 --- a/p2p/discover/table.go +++ b/p2p/discover/table.go @@ -520,6 +520,9 @@ func (tab *Table) delete(node *node) { } func (tab *Table) addIP(b *bucket, ip net.IP) bool { + if len(ip) == 0 { + return false // Nodes without IP cannot be added. + } if netutil.IsLAN(ip) { return true } diff --git a/p2p/discover/table_test.go b/p2p/discover/table_test.go index 895c284b27..562691e5b9 100644 --- a/p2p/discover/table_test.go +++ b/p2p/discover/table_test.go @@ -58,7 +58,7 @@ func testPingReplace(t *testing.T, newNodeIsResponding, lastInBucketIsResponding // Fill up the sender's bucket. pingKey, _ := crypto.HexToECDSA("45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8") - pingSender := wrapNode(enode.NewV4(&pingKey.PublicKey, net.IP{}, 99, 99)) + pingSender := wrapNode(enode.NewV4(&pingKey.PublicKey, net.IP{127, 0, 0, 1}, 99, 99)) last := fillBucket(tab, pingSender) // Add the sender as if it just pinged us. Revalidate should replace the last node in