diff --git a/pkg/vm/vm.go b/pkg/vm/vm.go index 27614ea9f..c914fd829 100644 --- a/pkg/vm/vm.go +++ b/pkg/vm/vm.go @@ -871,6 +871,9 @@ func (v *VM) execute(ctx *Context, op Instruction, parameter []byte) { } arr[index] = item case *MapItem: + if !t.Has(key.value) && len(t.value) >= MaxArraySize { + panic("too big map") + } t.Add(key.value, item) default: diff --git a/pkg/vm/vm_test.go b/pkg/vm/vm_test.go index 8cfc83505..d2f09923e 100644 --- a/pkg/vm/vm_test.go +++ b/pkg/vm/vm_test.go @@ -734,6 +734,38 @@ func TestSETITEMMap(t *testing.T) { assert.Equal(t, makeStackItem([]byte{0, 1}), vm.estack.Pop().value) } +func TestSETITEMBigMapBad(t *testing.T) { + prog := makeProgram(SETITEM) + vm := load(prog) + + m := NewMapItem() + for i := 0; i < MaxArraySize; i++ { + m.Add(makeStackItem(i), makeStackItem(i)) + } + vm.estack.Push(&Element{value: m}) + vm.estack.PushVal(MaxArraySize) + vm.estack.PushVal(0) + + vm.Run() + assert.Equal(t, true, vm.HasFailed()) +} + +func TestSETITEMBigMapGood(t *testing.T) { + prog := makeProgram(SETITEM) + vm := load(prog) + + m := NewMapItem() + for i := 0; i < MaxArraySize; i++ { + m.Add(makeStackItem(i), makeStackItem(i)) + } + vm.estack.Push(&Element{value: m}) + vm.estack.PushVal(0) + vm.estack.PushVal(0) + + vm.Run() + assert.Equal(t, false, vm.HasFailed()) +} + func TestSIZENoArgument(t *testing.T) { prog := makeProgram(SIZE) vm := load(prog)