From 0f6b066156996f6c870d35d51ca32b604ebc81b7 Mon Sep 17 00:00:00 2001 From: CPerezz Date: Wed, 15 Apr 2026 22:51:53 +0200 Subject: [PATCH] trie/bintrie: add nil-resolver guards for hashed node resolution --- trie/bintrie/store_ops.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/trie/bintrie/store_ops.go b/trie/bintrie/store_ops.go index fbd023c8f7..83885feacc 100644 --- a/trie/bintrie/store_ops.go +++ b/trie/bintrie/store_ops.go @@ -68,6 +68,9 @@ func (s *NodeStore) getSingle(ref NodeRef, stem []byte, suffix byte, resolver No if !hasParent { return nil, errors.New("getSingle: hashed node at root") } + if resolver == nil { + return nil, errors.New("getSingle: cannot resolve hashed node without resolver") + } hn := s.getHashed(cur.Index()) parentNode := s.getInternal(parentIdx) path := makeKeyPath(int(parentNode.depth), stem) @@ -138,6 +141,9 @@ func (s *NodeStore) getValuesAtStem(ref NodeRef, stem []byte, resolver NodeResol if !hasParent { return nil, errors.New("getValuesAtStem: hashed node at root") } + if resolver == nil { + return nil, errors.New("getValuesAtStem: cannot resolve hashed node without resolver") + } hn := s.getHashed(cur.Index()) parentNode := s.getInternal(parentIdx) path := makeKeyPath(int(parentNode.depth), stem) @@ -250,6 +256,9 @@ func (s *NodeStore) insertSingleInternal(stem []byte, suffix byte, value []byte, if pathLen == 0 { return errors.New("insertSingle: hashed node at root") } + if resolver == nil { + return errors.New("insertSingleInternal: cannot resolve hashed node without resolver") + } p := pathStack[pathLen-1] parentNode := s.getInternal(p.internalIdx) hn := s.getHashed(cur.Index()) @@ -371,6 +380,9 @@ func (s *NodeStore) insertValuesAtStem(ref NodeRef, stem []byte, values [][]byte bit := stem[node.depth/8] >> (7 - (node.depth % 8)) & 1 if bit == 0 { if node.left.Kind() == KindHashed { + if resolver == nil { + return ref, errors.New("insertValuesAtStem: cannot resolve hashed node without resolver") + } hn := s.getHashed(node.left.Index()) path := makeKeyPath(int(node.depth), stem) data, err := resolver(path, hn.hash) @@ -391,6 +403,9 @@ func (s *NodeStore) insertValuesAtStem(ref NodeRef, stem []byte, values [][]byte node.left = newChild } else { if node.right.Kind() == KindHashed { + if resolver == nil { + return ref, errors.New("insertValuesAtStem: cannot resolve hashed node without resolver") + } hn := s.getHashed(node.right.Index()) path := makeKeyPath(int(node.depth), stem) data, err := resolver(path, hn.hash)