From 435463e62011b064f9825d6cfb9c77f127cb1993 Mon Sep 17 00:00:00 2001 From: Evgeniy Stratonikov Date: Fri, 8 Oct 2021 15:05:36 +0300 Subject: [PATCH] vm: allow big string keys in PICKITEM Because `MaxKeySize` is bigger than integer size, we fail on integer cast while retreiving items from map. SETITEM is not affected. Signed-off-by: Evgeniy Stratonikov --- pkg/vm/vm.go | 3 ++- pkg/vm/vm_test.go | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/pkg/vm/vm.go b/pkg/vm/vm.go index 0211ce79e..df645ad21 100644 --- a/pkg/vm/vm.go +++ b/pkg/vm/vm.go @@ -1087,11 +1087,11 @@ func (v *VM) execute(ctx *Context, op opcode.Opcode, parameter []byte) (err erro validateMapKey(key) obj := v.estack.Pop() - index := int(key.BigInt().Int64()) switch t := obj.value.(type) { // Struct and Array items have their underlying value as []Item. case *stackitem.Array, *stackitem.Struct: + index := int(key.BigInt().Int64()) arr := t.Value().([]stackitem.Item) if index < 0 || index >= len(arr) { panic("PICKITEM: invalid index") @@ -1105,6 +1105,7 @@ func (v *VM) execute(ctx *Context, op opcode.Opcode, parameter []byte) (err erro } v.estack.PushItem(t.Value().([]stackitem.MapElement)[index].Value.Dup()) default: + index := int(key.BigInt().Int64()) arr := obj.Bytes() if index < 0 || index >= len(arr) { panic("PICKITEM: invalid index") diff --git a/pkg/vm/vm_test.go b/pkg/vm/vm_test.go index 63ca28fd1..0395f813d 100644 --- a/pkg/vm/vm_test.go +++ b/pkg/vm/vm_test.go @@ -1205,6 +1205,16 @@ func TestSETITEMMap(t *testing.T) { m := stackitem.NewMap() m.Add(stackitem.Make(5), stackitem.Make(3)) runWithArgs(t, prog, []byte{0, 1}, m, 5, m, 5, []byte{0, 1}) + + t.Run("big key", func(t *testing.T) { + m := stackitem.NewMap() + key := make([]byte, stackitem.MaxKeySize) + for i := range key { + key[i] = 0x0F + } + m.Add(stackitem.NewByteArray(key), stackitem.Make(3)) + runWithArgs(t, prog, "value", m, key, m, key, "value") + }) } func TestSETITEMBigMapBad(t *testing.T) {