diff --git a/pkg/vm/context.go b/pkg/vm/context.go index 3cbace4b7..8c0c2a1dc 100644 --- a/pkg/vm/context.go +++ b/pkg/vm/context.go @@ -95,6 +95,9 @@ func (c *Context) Next() (opcode.Opcode, []byte, error) { var err error c.ip = c.nextip + if c.ip < 0 { + return 0, nil, errors.New("invalid instruction offset") + } if c.ip >= len(c.prog) { return opcode.RET, nil, nil } diff --git a/pkg/vm/vm_test.go b/pkg/vm/vm_test.go index 1d0e107d2..dd6ffdd5b 100644 --- a/pkg/vm/vm_test.go +++ b/pkg/vm/vm_test.go @@ -1385,6 +1385,17 @@ func TestKEYS(t *testing.T) { t.Run("WrongType", getTestFuncForVM(prog, nil, []stackitem.Item{})) } +func TestTry_ENDFINALLY_before_ENDTRY(t *testing.T) { + prog := makeProgram(opcode.TRY, 0, 3, opcode.ENDFINALLY) + require.NoError(t, IsScriptCorrect(prog, nil)) + + v := load(prog) + + var err error + require.NotPanics(t, func() { err = v.Run() }) + require.Error(t, err) +} + func TestVALUESMap(t *testing.T) { prog := makeProgram(opcode.VALUES) vm := load(prog)