stackitem: limit deserialization to MaxDeserialized items

Follow neo-project/neo#2531. Even though it's not strictly required (our node
handles problematic script just fine) we better be compliant wrt
deserialization behavior. MaxDeserialized is introduced to avoid moving
MaxStackSize which is a VM parameter.
This commit is contained in:
Roman Khimov 2021-07-17 22:21:33 +03:00
parent aab18c3083
commit df2430d5e4
3 changed files with 53 additions and 9 deletions

View file

@ -144,7 +144,7 @@ func TestSerialize(t *testing.T) {
for i := 0; i < MaxArraySize; i++ {
m.Add(Make(i), zeroByteArray)
}
testSerialize(t, nil, m)
// testSerialize(t, nil, m) // It contains too many elements already, so ErrTooBig.
m.Add(Make(100500), zeroByteArray)
data, err := Serialize(m)
@ -154,6 +154,23 @@ func TestSerialize(t *testing.T) {
})
}
func TestDeserializeTooManyElements(t *testing.T) {
item := Make(0)
for i := 0; i < MaxDeserialized-1; i++ { // 1 for zero inner element.
item = Make([]Item{item})
}
data, err := Serialize(item)
require.NoError(t, err)
_, err = Deserialize(data)
require.NoError(t, err)
item = Make([]Item{item})
data, err = Serialize(item)
require.NoError(t, err)
_, err = Deserialize(data)
require.True(t, errors.Is(err, ErrTooBig), err)
}
func BenchmarkEncodeBinary(b *testing.B) {
arr := getBigArray(15)