From bbd7d000680818750b9aff8781cc4e0d404ac0be Mon Sep 17 00:00:00 2001 From: Banana-J Date: Sun, 11 Feb 2024 20:32:44 +1100 Subject: [PATCH] fix: missing validation in unpacklog (#416) Co-authored-by: wjrjerome --- accounts/abi/abi.go | 1 - accounts/abi/argument.go | 2 +- accounts/abi/bind/base.go | 11 +++++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/accounts/abi/abi.go b/accounts/abi/abi.go index 3336be456f..e3687968a5 100644 --- a/accounts/abi/abi.go +++ b/accounts/abi/abi.go @@ -148,7 +148,6 @@ func (abi *ABI) MethodById(sigdata []byte) (*Method, error) { return nil, fmt.Errorf("no method with id: %#x", sigdata[:4]) } - // revertSelector is a special function selector for revert reason unpacking. var revertSelector = crypto.Keccak256([]byte("Error(string)"))[:4] diff --git a/accounts/abi/argument.go b/accounts/abi/argument.go index a45885c948..5ff473f624 100644 --- a/accounts/abi/argument.go +++ b/accounts/abi/argument.go @@ -290,7 +290,7 @@ func capitalise(input string) string { return strings.ToUpper(input[:1]) + input[1:] } -//unpackStruct extracts each argument into its corresponding struct field +// unpackStruct extracts each argument into its corresponding struct field func unpackStruct(value, reflectValue reflect.Value, arg Argument) error { name := capitalise(arg.Name) typ := value.Type() diff --git a/accounts/abi/bind/base.go b/accounts/abi/bind/base.go index 56bf28530d..1b5c71701c 100644 --- a/accounts/abi/bind/base.go +++ b/accounts/abi/bind/base.go @@ -30,6 +30,10 @@ import ( "github.com/XinFinOrg/XDPoSChain/event" ) +var ( + errNoEventSignature = errors.New("no event signature") +) + // SignerFn is a signer function callback when a contract requires a method to // sign the transaction before submission. type SignerFn func(types.Signer, common.Address, *types.Transaction) (*types.Transaction, error) @@ -326,6 +330,13 @@ func (c *BoundContract) WatchLogs(opts *WatchOpts, name string, query ...[]inter // UnpackLog unpacks a retrieved log into the provided output structure. func (c *BoundContract) UnpackLog(out interface{}, event string, log types.Log) error { + // Anonymous events are not supported. + if len(log.Topics) == 0 { + return errNoEventSignature + } + if log.Topics[0] != c.abi.Events[event].Id() { + return fmt.Errorf("event signature mismatch") + } if len(log.Data) > 0 { if err := c.abi.Unpack(out, event, log.Data); err != nil { return err