From 96db952576e2928be7437ddaafa75dfa5f8122d2 Mon Sep 17 00:00:00 2001 From: Daniel Liu Date: Mon, 24 Feb 2025 17:31:41 +0800 Subject: [PATCH] downloader: fix edgecase where returned index is OOB for downloader (#18335) --- eth/downloader/downloader.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 51f68f6f2a..970ad7406e 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -1510,7 +1510,15 @@ func (d *Downloader) importBlockResults(results []*fetchResult) error { blocks[i] = types.NewBlockWithHeader(result.Header).WithBody(result.Transactions, result.Uncles) } if index, err := d.blockchain.InsertChain(blocks); err != nil { - log.Debug("Downloaded item processing failed", "number", results[index].Header.Number, "hash", results[index].Header.Hash(), "err", err) + if index < len(results) { + log.Debug("Downloaded item processing failed", "number", results[index].Header.Number, "hash", results[index].Header.Hash(), "err", err) + } else { + // The InsertChain method in blockchain.go will sometimes return an out-of-bounds index, + // when it needs to preprocess blocks to import a sidechain. + // The importer will put together a new list of blocks to import, which is a superset + // of the blocks delivered from the downloader, and the indexing will be off. + log.Debug("Downloaded item processing failed on sidechain import", "index", index, "err", err) + } return errInvalidChain } if d.handleProposedBlock != nil {