Skip to content

Commit 5dd0fe2

Browse files
authored
p2p: cleanup v4 if v5 failed (#33005)
Clean the previous resource (v4) if the latter (v5) failed.
1 parent ae37b49 commit 5dd0fe2

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

p2p/server.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,11 @@ func (srv *Server) setupDiscovery() error {
490490
}
491491
srv.discv5, err = discover.ListenV5(sconn, srv.localnode, cfg)
492492
if err != nil {
493+
// Clean up v4 if v5 setup fails.
494+
if srv.discv4 != nil {
495+
srv.discv4.Close()
496+
srv.discv4 = nil
497+
}
493498
return err
494499
}
495500
}

p2p/server_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,33 @@ func TestServerInboundThrottle(t *testing.T) {
579579
}
580580
}
581581

582+
func TestServerDiscoveryV5FailureRollsBackV4(t *testing.T) {
583+
badBootstrap := enode.NewV4(&newkey().PublicKey, net.ParseIP("127.0.0.1"), 30303, 0) // invalid V5 of a V4 node
584+
srv := &Server{
585+
Config: Config{
586+
PrivateKey: newkey(),
587+
ListenAddr: "",
588+
DiscAddr: "127.0.0.1:0",
589+
MaxPeers: 5,
590+
DiscoveryV4: true,
591+
DiscoveryV5: true,
592+
BootstrapNodesV5: []*enode.Node{badBootstrap},
593+
Logger: testlog.Logger(t, log.LvlTrace),
594+
},
595+
}
596+
err := srv.Start()
597+
if err == nil {
598+
t.Fatal("expected discovery v5 startup failure")
599+
}
600+
if !strings.Contains(err.Error(), "bad bootstrap node") {
601+
t.Fatalf("unexpected error: %v", err)
602+
}
603+
if srv.DiscoveryV4() != nil {
604+
t.Fatal("discovery v4 not cleaned after failure")
605+
}
606+
srv.Stop()
607+
}
608+
582609
func listenFakeAddr(network, laddr string, remoteAddr net.Addr) (net.Listener, error) {
583610
l, err := net.Listen(network, laddr)
584611
if err == nil {

0 commit comments

Comments
 (0)