diff options
author | Péter Szilágyi <peterke@gmail.com> | 2017-10-14 20:57:08 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-14 20:57:08 +0800 |
commit | fdb3bd287ebe66f3b3da8a14a90cb162e8dc1d5a (patch) | |
tree | 970ede9cd6be21d32eb5bab8c6ed4ffcf72e0778 | |
parent | 41b77455296526c249abdf812e17f449e7f362e4 (diff) | |
parent | a91e6822349b6daa30a311f75b7d824739e5823d (diff) | |
download | dexon-fdb3bd287ebe66f3b3da8a14a90cb162e8dc1d5a.tar.gz dexon-fdb3bd287ebe66f3b3da8a14a90cb162e8dc1d5a.tar.zst dexon-fdb3bd287ebe66f3b3da8a14a90cb162e8dc1d5a.zip |
Merge pull request #15298 from karalabe/stack-then-readonly
core/vm: check opcode stack before readonly enforcement
-rw-r--r-- | core/vm/interpreter.go | 23 |
1 files changed, 10 insertions, 13 deletions
diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go index 94b922c79..516438509 100644 --- a/core/vm/interpreter.go +++ b/core/vm/interpreter.go @@ -138,10 +138,10 @@ func (in *Interpreter) Run(snapshot int, contract *Contract, input []byte) (ret pc = uint64(0) // program counter cost uint64 // copies used by tracer - stackCopy = newstack() // stackCopy needed for Tracer since stack is mutated by 63/64 gas rule - pcCopy uint64 // needed for the deferred Tracer - gasCopy uint64 // for Tracer to log gas remaining before execution - logged bool // deferred Tracer should ignore already logged steps + stackCopy = newstack() // stackCopy needed for Tracer since stack is mutated by 63/64 gas rule + pcCopy uint64 // needed for the deferred Tracer + gasCopy uint64 // for Tracer to log gas remaining before execution + logged bool // deferred Tracer should ignore already logged steps ) contract.Input = input @@ -169,22 +169,19 @@ func (in *Interpreter) Run(snapshot int, contract *Contract, input []byte) (ret } } - // get the operation from the jump table matching the opcode + // Get the operation from the jump table matching the opcode and validate the + // stack and make sure there enough stack items available to perform the operation operation := in.cfg.JumpTable[op] - if err := in.enforceRestrictions(op, operation, stack); err != nil { - return nil, err - } - - // if the op is invalid abort the process and return an error if !operation.valid { return nil, fmt.Errorf("invalid opcode 0x%x", int(op)) } - - // validate the stack and make sure there enough stack items available - // to perform the operation if err := operation.validateStack(stack); err != nil { return nil, err } + // If the operation is valid, enforce and write restrictions + if err := in.enforceRestrictions(op, operation, stack); err != nil { + return nil, err + } var memorySize uint64 // calculate the new memory size and expand the memory to fit |