mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-19 02:12:23 +00:00
core/vm: fix fuzzing found error, where RJUMP overwrites stack bounds
This commit is contained in:
parent
2537d43008
commit
a7953691df
1 changed files with 8 additions and 3 deletions
|
|
@ -15,7 +15,7 @@ func validateControlFlow2(code []byte, section int, metadata []*FunctionMetadata
|
|||
var (
|
||||
stackBounds = make(map[int]*bounds)
|
||||
maxStackHeight = int(metadata[section].Input)
|
||||
debugging = !true
|
||||
debugging = true
|
||||
)
|
||||
|
||||
setBounds := func(pos, min, maxi int) *bounds {
|
||||
|
|
@ -118,7 +118,7 @@ func validateControlFlow2(code []byte, section int, metadata []*FunctionMetadata
|
|||
nextPos := pos + 2 + parseInt16(code[pos+1:])
|
||||
next = append(next, nextPos)
|
||||
// We set the stack bounds of the destination
|
||||
// and skip the argument
|
||||
// and skip the argument, only for RJUMP, all other opcodes are handled later
|
||||
if nextPos+1 < pos {
|
||||
nextBounds, ok := stackBounds[nextPos+1]
|
||||
if !ok {
|
||||
|
|
@ -128,7 +128,12 @@ func validateControlFlow2(code []byte, section int, metadata []*FunctionMetadata
|
|||
return 0, ErrInvalidMaxStackHeight
|
||||
}
|
||||
}
|
||||
setBounds(next[0]+1, currentStackMin, currentStackMax)
|
||||
nextBounds, ok := stackBounds[nextPos+1]
|
||||
if !ok {
|
||||
setBounds(nextPos+1, currentStackMin, currentStackMax)
|
||||
} else {
|
||||
setBounds(nextPos+1, min(nextBounds.min, currentStackMin), max(nextBounds.max, currentStackMax))
|
||||
}
|
||||
case RJUMPI:
|
||||
arg := parseInt16(code[pos+1:])
|
||||
next = append(next, pos+2)
|
||||
|
|
|
|||
Loading…
Reference in a new issue