rlp: finalize listIterator on parse error to prevent non-advancing loops#33245 (#1854)

This commit is contained in:
wit liu 2025-12-11 19:21:46 +08:00 committed by GitHub
parent b3935db5f1
commit 69d8d042e6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -37,15 +37,24 @@ func NewListIterator(data RawValue) (*listIterator, error) {
return it, nil
}
// Next forwards the iterator one step, returns true if it was not at end yet
// Next forwards the iterator one step.
// Returns true if there is a next item or an error occurred on this step (check Err()).
// On parse error, the iterator is marked finished and subsequent calls return false.
func (it *listIterator) Next() bool {
if len(it.data) == 0 {
return false
}
_, t, c, err := readKind(it.data)
if err != nil {
it.next = nil
it.err = err
// Mark iteration as finished to avoid potential infinite loops on subsequent Next calls.
it.data = nil
return true
}
it.next = it.data[:t+c]
it.data = it.data[t+c:]
it.err = err
it.err = nil
return true
}