aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPéter Szilágyi <peterke@gmail.com>2017-10-14 20:57:08 +0800
committerGitHub <noreply@github.com>2017-10-14 20:57:08 +0800
commitfdb3bd287ebe66f3b3da8a14a90cb162e8dc1d5a (patch)
tree970ede9cd6be21d32eb5bab8c6ed4ffcf72e0778
parent41b77455296526c249abdf812e17f449e7f362e4 (diff)
parenta91e6822349b6daa30a311f75b7d824739e5823d (diff)
downloaddexon-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.go23
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