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 <evgeniy@nspcc.ru>
This commit is contained in:
parent
fa2ca3f25a
commit
435463e620
2 changed files with 12 additions and 1 deletions
|
@ -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")
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue