vm: fix invocation stack checks

It should be done on every new context push.
This commit is contained in:
Roman Khimov 2020-10-15 16:11:26 +03:00
parent fe0ec91636
commit 3d8434a50c

View file

@ -273,6 +273,7 @@ func (v *VM) LoadScript(b []byte) {
// LoadScriptWithFlags loads script and sets call flag to f. // LoadScriptWithFlags loads script and sets call flag to f.
func (v *VM) LoadScriptWithFlags(b []byte, f smartcontract.CallFlag) { func (v *VM) LoadScriptWithFlags(b []byte, f smartcontract.CallFlag) {
v.checkInvocationStackSize()
ctx := NewContext(b) ctx := NewContext(b)
v.estack = v.newItemStack("estack") v.estack = v.newItemStack("estack")
ctx.estack = v.estack ctx.estack = v.estack
@ -1226,7 +1227,6 @@ func (v *VM) execute(ctx *Context, op opcode.Opcode, parameter []byte) (err erro
} }
case opcode.CALL, opcode.CALLL: case opcode.CALL, opcode.CALLL:
v.checkInvocationStackSize()
// Note: jump offset must be calculated regarding to new context, // Note: jump offset must be calculated regarding to new context,
// but it is cloned and thus has the same script and instruction pointer. // but it is cloned and thus has the same script and instruction pointer.
v.call(ctx, v.getJumpOffset(ctx, parameter)) v.call(ctx, v.getJumpOffset(ctx, parameter))
@ -1476,6 +1476,7 @@ func (v *VM) Call(ctx *Context, offset int) {
// affect the invocation counter and is only being used by vm // affect the invocation counter and is only being used by vm
// package. // package.
func (v *VM) call(ctx *Context, offset int) { func (v *VM) call(ctx *Context, offset int) {
v.checkInvocationStackSize()
newCtx := ctx.Copy() newCtx := ctx.Copy()
newCtx.CheckReturn = NoCheck newCtx.CheckReturn = NoCheck
newCtx.local = nil newCtx.local = nil