stackitem: limit EQUAL for deeply nested structs

See neo-project/neo-vm#428.
This commit is contained in:
Roman Khimov 2021-07-19 10:07:05 +03:00
parent f89f0300f6
commit ee4a647934
3 changed files with 73 additions and 5 deletions

View file

@ -172,6 +172,11 @@ var equalsTestCases = map[string][]struct {
item2: NewStruct([]Item{NewBigInteger(big.NewInt(1))}),
result: true,
},
{
item1: NewStruct([]Item{NewBigInteger(big.NewInt(1)), NewStruct([]Item{})}),
item2: NewStruct([]Item{NewBigInteger(big.NewInt(1)), NewStruct([]Item{})}),
result: true,
},
},
"bigint": {
{
@ -381,6 +386,41 @@ func TestEquals(t *testing.T) {
}
}
func TestEqualsDeepStructure(t *testing.T) {
const perStruct = 4
var items = []Item{}
var num int
for i := 0; i < perStruct; i++ {
items = append(items, Make(0))
num++
}
var layerUp = func(sa *Struct, num int) (*Struct, int) {
items := []Item{}
for i := 0; i < perStruct; i++ {
clon, err := sa.Clone(100500)
require.NoError(t, err)
items = append(items, clon)
}
num *= perStruct
num++
return NewStruct(items), num
}
var sa = NewStruct(items)
for i := 0; i < 4; i++ {
sa, num = layerUp(sa, num)
}
require.Less(t, num, MaxComparableNumOfItems)
sb, err := sa.Clone(num)
require.NoError(t, err)
require.True(t, sa.Equals(sb))
sa, num = layerUp(sa, num)
require.Less(t, MaxComparableNumOfItems, num)
sb, err = sa.Clone(num)
require.NoError(t, err)
require.Panics(t, func() { sa.Equals(sb) })
}
var marshalJSONTestCases = []struct {
input Item
result []byte