Skip to content

Commit

Permalink
smartcontract: disallow Null and non-utf8 String
Browse files Browse the repository at this point in the history
Follow the neo-project/neo#2810 (comment).

Signed-off-by: Anna Shaleva <shaleva.ann@nspcc.ru>
  • Loading branch information
AnnaShaleva committed Aug 18, 2023
1 parent 31294c2 commit 892d51f
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 21 deletions.
5 changes: 4 additions & 1 deletion pkg/smartcontract/param_type.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"fmt"
"math/big"
"strings"
"unicode/utf8"

"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
"github.com/nspcc-dev/neo-go/pkg/encoding/address"
Expand Down Expand Up @@ -203,8 +204,10 @@ func (pt ParamType) Match(v stackitem.Item) bool {
return vt == stackitem.BooleanT
case IntegerType:
return vt == stackitem.IntegerT
case ByteArrayType, StringType:
case ByteArrayType:
return vt == stackitem.ByteArrayT || vt == stackitem.BufferT || vt == stackitem.AnyT
case StringType:
return (vt == stackitem.ByteArrayT || vt == stackitem.BufferT) && utf8.Valid(v.Value().([]byte))
case Hash160Type:
return checkBytesWithLen(vt, v, Hash160Len)
case Hash256Type:
Expand Down
42 changes: 22 additions & 20 deletions pkg/smartcontract/param_type_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -428,25 +428,27 @@ func TestConvertToStackitemType(t *testing.T) {

func TestParamTypeMatch(t *testing.T) {
for itm, pt := range map[stackitem.Item]ParamType{
&stackitem.Pointer{}: BoolType,
&stackitem.Pointer{}: MapType,
stackitem.Make(0): BoolType,
stackitem.Make(0): ByteArrayType,
stackitem.Make(0): StringType,
stackitem.Make(false): ByteArrayType,
stackitem.Make(true): StringType,
stackitem.Make([]byte{1}): Hash160Type,
stackitem.Make([]byte{1}): Hash256Type,
stackitem.Make([]byte{1}): PublicKeyType,
stackitem.Make([]byte{1}): SignatureType,
stackitem.Make(0): Hash160Type,
stackitem.Make(0): Hash256Type,
stackitem.Make(0): PublicKeyType,
stackitem.Make(0): SignatureType,
stackitem.Make(0): ArrayType,
stackitem.Make(0): MapType,
stackitem.Make(0): InteropInterfaceType,
stackitem.Make(0): VoidType,
&stackitem.Pointer{}: BoolType,
&stackitem.Pointer{}: MapType,
stackitem.Make(0): BoolType,
stackitem.Make(0): ByteArrayType,
stackitem.Make(0): StringType,
stackitem.Make(false): ByteArrayType,
stackitem.Make(true): StringType,
stackitem.Make([]byte{1}): Hash160Type,
stackitem.Make([]byte{1}): Hash256Type,
stackitem.Make([]byte{1}): PublicKeyType,
stackitem.Make([]byte{1}): SignatureType,
stackitem.Make(0): Hash160Type,
stackitem.Make(0): Hash256Type,
stackitem.Make(0): PublicKeyType,
stackitem.Make(0): SignatureType,
stackitem.Make(0): ArrayType,
stackitem.Make(0): MapType,
stackitem.Make(0): InteropInterfaceType,
stackitem.Make(0): VoidType,
stackitem.Null{}: StringType,
stackitem.Make([]byte{0x80}): StringType, // non utf-8
} {
require.Falsef(t, pt.Match(itm), "%s - %s", pt.String(), itm.String())
}
Expand All @@ -456,11 +458,11 @@ func TestParamTypeMatch(t *testing.T) {
stackitem.Make(0): IntegerType,
stackitem.Make(100500): IntegerType,
stackitem.Make([]byte{1}): ByteArrayType,
stackitem.Make([]byte{0x80}): ByteArrayType, // non utf-8
stackitem.Make([]byte{1}): StringType,
stackitem.NewBuffer([]byte{1}): ByteArrayType,
stackitem.NewBuffer([]byte{1}): StringType,
stackitem.Null{}: ByteArrayType,
stackitem.Null{}: StringType,
stackitem.Make(util.Uint160{}.BytesBE()): Hash160Type,
stackitem.Make(util.Uint256{}.BytesBE()): Hash256Type,
stackitem.Null{}: Hash160Type,
Expand Down

0 comments on commit 892d51f

Please sign in to comment.