aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Holst Swende <martin@swende.se>2018-10-01 20:17:37 +0800
committerGuillaume Ballet <gballet@gmail.com>2018-10-01 20:17:36 +0800
commit96fd50be10885c9b3033404df698177fdb63d036 (patch)
tree07cbebfe3af7a04b047c015bebced6aae4471c16
parentdc5d643bb59812cda578fac941c2f1da316bc9d7 (diff)
downloadgo-tangerine-96fd50be10885c9b3033404df698177fdb63d036.tar.gz
go-tangerine-96fd50be10885c9b3033404df698177fdb63d036.tar.zst
go-tangerine-96fd50be10885c9b3033404df698177fdb63d036.zip
accounts/abi: fix panic in MethodById lookup. Fixes #17797 (#17798)
-rw-r--r--accounts/abi/abi.go3
-rw-r--r--accounts/abi/abi_test.go11
2 files changed, 13 insertions, 1 deletions
diff --git a/accounts/abi/abi.go b/accounts/abi/abi.go
index 254b1f7fb..535e5d78b 100644
--- a/accounts/abi/abi.go
+++ b/accounts/abi/abi.go
@@ -137,6 +137,9 @@ func (abi *ABI) UnmarshalJSON(data []byte) error {
// MethodById looks up a method by the 4-byte id
// returns nil if none found
func (abi *ABI) MethodById(sigdata []byte) (*Method, error) {
+ if len(sigdata) < 4 {
+ return nil, fmt.Errorf("data too short (% bytes) for abi method lookup", len(sigdata))
+ }
for _, method := range abi.Methods {
if bytes.Equal(method.Id(), sigdata[:4]) {
return &method, nil
diff --git a/accounts/abi/abi_test.go b/accounts/abi/abi_test.go
index 8018df775..59ba79cb6 100644
--- a/accounts/abi/abi_test.go
+++ b/accounts/abi/abi_test.go
@@ -711,5 +711,14 @@ func TestABI_MethodById(t *testing.T) {
t.Errorf("Method %v (id %v) not 'findable' by id in ABI", name, common.ToHex(m.Id()))
}
}
-
+ // Also test empty
+ if _, err := abi.MethodById([]byte{0x00}); err == nil {
+ t.Errorf("Expected error, too short to decode data")
+ }
+ if _, err := abi.MethodById([]byte{}); err == nil {
+ t.Errorf("Expected error, too short to decode data")
+ }
+ if _, err := abi.MethodById(nil); err == nil {
+ t.Errorf("Expected error, nil is short to decode data")
+ }
}