From 5cafd070095646674ca9bee15c6caa1e3123ee91 Mon Sep 17 00:00:00 2001 From: Mayveskii Date: Thu, 26 Mar 2026 20:21:58 +0300 Subject: [PATCH] eth/protocols/snap: handle StateReader error in ServiceTrieNodesQuery When the snapshot is unavailable, ServiceTrieNodesQuery falls back to triedb.StateReader but discards the error. If StateReader fails (e.g. state pruned or DB corruption), the nil reader is passed to trie operations, causing a nil pointer dereference when serving trie node requests. Return a proper error instead of silently proceeding with a nil state reader. --- eth/protocols/snap/handler.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/eth/protocols/snap/handler.go b/eth/protocols/snap/handler.go index 071a0419fb..9a5d55dc46 100644 --- a/eth/protocols/snap/handler.go +++ b/eth/protocols/snap/handler.go @@ -561,7 +561,11 @@ func ServiceGetTrieNodesQuery(chain *core.BlockChain, req *GetTrieNodesPacket, s reader = chain.Snapshots().Snapshot(req.Root) } if reader == nil { - reader, _ = triedb.StateReader(req.Root) + var err error + reader, err = triedb.StateReader(req.Root) + if err != nil { + return nil, fmt.Errorf("failed to create state reader for root %x: %w", req.Root, err) + } } // Retrieve trie nodes until the packet size limit is reached