fix(bintrie): prevent OOB on 31-byte stems at depth 248

This commit is contained in:
Fibonacci747 2025-12-01 15:33:30 +00:00
parent da3822dcec
commit 391f3bea5c
2 changed files with 7 additions and 1 deletions

View file

@ -47,6 +47,9 @@ func (h HashedNode) GetValuesAtStem(_ []byte, _ NodeResolverFn) ([][]byte, error
} }
func (h HashedNode) InsertValuesAtStem(stem []byte, values [][]byte, resolver NodeResolverFn, depth int) (BinaryNode, error) { func (h HashedNode) InsertValuesAtStem(stem []byte, values [][]byte, resolver NodeResolverFn, depth int) (BinaryNode, error) {
if depth >= StemSize*8 {
return nil, errors.New("InsertValuesAtStem resolve error: node too deep")
}
// Step 1: Generate the path for this node's position in the tree // Step 1: Generate the path for this node's position in the tree
path, err := keyToPath(depth, stem) path, err := keyToPath(depth, stem)
if err != nil { if err != nil {

View file

@ -44,7 +44,7 @@ type InternalNode struct {
// GetValuesAtStem retrieves the group of values located at the given stem key. // GetValuesAtStem retrieves the group of values located at the given stem key.
func (bt *InternalNode) GetValuesAtStem(stem []byte, resolver NodeResolverFn) ([][]byte, error) { func (bt *InternalNode) GetValuesAtStem(stem []byte, resolver NodeResolverFn) ([][]byte, error) {
if bt.depth > 31*8 { if bt.depth >= StemSize*8 {
return nil, errors.New("node too deep") return nil, errors.New("node too deep")
} }
@ -134,6 +134,9 @@ func (bt *InternalNode) Hash() common.Hash {
// Already-existing values will be overwritten. // Already-existing values will be overwritten.
func (bt *InternalNode) InsertValuesAtStem(stem []byte, values [][]byte, resolver NodeResolverFn, depth int) (BinaryNode, error) { func (bt *InternalNode) InsertValuesAtStem(stem []byte, values [][]byte, resolver NodeResolverFn, depth int) (BinaryNode, error) {
var err error var err error
if bt.depth >= StemSize*8 {
return nil, errors.New("node too deep")
}
bit := stem[bt.depth/8] >> (7 - (bt.depth % 8)) & 1 bit := stem[bt.depth/8] >> (7 - (bt.depth % 8)) & 1
if bit == 0 { if bit == 0 {
if bt.left == nil { if bt.left == nil {