Skip to content

Commit 99bbb33

Browse files
karalabefjl
authored andcommitted
eth: fix a rare datarace on CHT challenge reply / shutdown (#25831)
1 parent a32e69a commit 99bbb33

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

eth/handler.go

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -391,11 +391,16 @@ func (h *handler) runEthPeer(peer *eth.Peer, handler eth.Handler) error {
391391
if h.checkpointHash != (common.Hash{}) {
392392
// Request the peer's checkpoint header for chain height/weight validation
393393
resCh := make(chan *eth.Response)
394-
if _, err := peer.RequestHeadersByNumber(h.checkpointNumber, 1, 0, false, resCh); err != nil {
394+
395+
req, err := peer.RequestHeadersByNumber(h.checkpointNumber, 1, 0, false, resCh)
396+
if err != nil {
395397
return err
396398
}
397399
// Start a timer to disconnect if the peer doesn't reply in time
398400
go func() {
401+
// Ensure the request gets cancelled in case of error/drop
402+
defer req.Close()
403+
399404
timeout := time.NewTimer(syncChallengeTimeout)
400405
defer timeout.Stop()
401406

@@ -437,10 +442,15 @@ func (h *handler) runEthPeer(peer *eth.Peer, handler eth.Handler) error {
437442
// If we have any explicit peer required block hashes, request them
438443
for number, hash := range h.requiredBlocks {
439444
resCh := make(chan *eth.Response)
440-
if _, err := peer.RequestHeadersByNumber(number, 1, 0, false, resCh); err != nil {
445+
446+
req, err := peer.RequestHeadersByNumber(number, 1, 0, false, resCh)
447+
if err != nil {
441448
return err
442449
}
443-
go func(number uint64, hash common.Hash) {
450+
go func(number uint64, hash common.Hash, req *eth.Request) {
451+
// Ensure the request gets cancelled in case of error/drop
452+
defer req.Close()
453+
444454
timeout := time.NewTimer(syncChallengeTimeout)
445455
defer timeout.Stop()
446456

@@ -469,7 +479,7 @@ func (h *handler) runEthPeer(peer *eth.Peer, handler eth.Handler) error {
469479
peer.Log().Warn("Required block challenge timed out, dropping", "addr", peer.RemoteAddr(), "type", peer.Name())
470480
h.removePeer(peer.ID())
471481
}
472-
}(number, hash)
482+
}(number, hash, req)
473483
}
474484
// Handle incoming messages until the connection is torn down
475485
return handler(peer)

0 commit comments

Comments
 (0)