@@ -165,7 +165,10 @@ func (t *XDCXTrie) Commit(onleaf trie.LeafCallback) (common.Hash, error) {
165165 // PR #1103 causes TestRevertStates and TestDumpState to fail,
166166 // but we will not fix them since XDCx has been abandoned.
167167 // TODO(daniel): The following code may be incorrect, ref PR #25320:
168- root , nodes := t .trie .Commit (false )
168+ root , nodes , err := t .trie .Commit (false )
169+ if err != nil {
170+ return common.Hash {}, err
171+ }
169172 if nodes != nil {
170173 if err := t .trie .UpdateDb (root , types .EmptyRootHash , 0 , trienode .NewWithNodeSet (nodes )); err != nil {
171174 return common.Hash {}, err
@@ -186,8 +189,37 @@ func (t *XDCXTrie) Copy() *XDCXTrie {
186189// NodeIterator returns an iterator that returns nodes of the underlying trie. Iteration
187190// starts at the key after the given start key.
188191func (t * XDCXTrie ) NodeIterator (start []byte ) trie.NodeIterator {
189- return t .trie .NodeIterator (start )
192+ trieIt , err := t .trie .NodeIterator (start )
193+ if err != nil {
194+ log .Error (fmt .Sprintf ("Unhandled trie error: %v" , err ))
195+ return errNodeIterator {err : err }
196+ }
197+ return trieIt
198+ }
199+
200+ // errNodeIterator is a safe, non-nil iterator that reports an error and yields no nodes.
201+ // It prevents nil dereferences when callers don't check for a nil iterator.
202+ type errNodeIterator struct {
203+ err error
204+ }
205+
206+ func (it errNodeIterator ) Next (bool ) bool { return false }
207+ func (it errNodeIterator ) Error () error { return it .err }
208+ func (it errNodeIterator ) Hash () common.Hash {
209+ return common.Hash {}
210+ }
211+ func (it errNodeIterator ) Parent () common.Hash {
212+ return common.Hash {}
213+ }
214+ func (it errNodeIterator ) Path () []byte { return nil }
215+ func (it errNodeIterator ) NodeBlob () []byte { return nil }
216+ func (it errNodeIterator ) Leaf () bool { return false }
217+ func (it errNodeIterator ) LeafKey () []byte { return nil }
218+ func (it errNodeIterator ) LeafBlob () []byte { return nil }
219+ func (it errNodeIterator ) LeafProof () [][]byte {
220+ return nil
190221}
222+ func (it errNodeIterator ) AddResolver (trie.NodeResolver ) {}
191223
192224// hashKey returns the hash of key as an ephemeral buffer.
193225// The caller must not hold onto the return value because it will become
0 commit comments