eth rlp: fix warts

This commit is contained in:
vyzo 2022-11-11 04:58:15 +02:00
parent 18f2a14a00
commit 54f311d94a

View File

@ -8,6 +8,9 @@ import (
"golang.org/x/xerrors" "golang.org/x/xerrors"
) )
// set a limit to make sure it doesn't loop infinitely
const maxListElements = 500
func EncodeRLP(val interface{}) ([]byte, error) { func EncodeRLP(val interface{}) ([]byte, error) {
return encodeRLP(val) return encodeRLP(val)
} }
@ -48,7 +51,8 @@ func encodeLength(length int) (lenInBytes []byte, err error) {
} }
func encodeRLP(val interface{}) ([]byte, error) { func encodeRLP(val interface{}) ([]byte, error) {
if data, ok := val.([]byte); ok { switch data := val.(type) {
case []byte:
if len(data) == 1 && data[0] <= 0x7f { if len(data) == 1 && data[0] <= 0x7f {
return data, nil return data, nil
} else if len(data) <= 55 { } else if len(data) <= 55 {
@ -65,7 +69,7 @@ func encodeRLP(val interface{}) ([]byte, error) {
append(lenInBytes, data...)..., append(lenInBytes, data...)...,
), nil ), nil
} }
} else if data, ok := val.([]interface{}); ok { case []interface{}:
encodedList, err := encodeRLPListItems(data) encodedList, err := encodeRLPListItems(data)
if err != nil { if err != nil {
return nil, err return nil, err
@ -86,8 +90,9 @@ func encodeRLP(val interface{}) ([]byte, error) {
[]byte{prefix}, []byte{prefix},
append(lenInBytes, encodedList...)..., append(lenInBytes, encodedList...)...,
), nil ), nil
} default:
return nil, fmt.Errorf("input data should either be a list or a byte array") return nil, fmt.Errorf("input data should either be a list or a byte array")
}
} }
func DecodeRLP(data []byte) (interface{}, error) { func DecodeRLP(data []byte) (interface{}, error) {
@ -160,8 +165,7 @@ func decodeListElems(data []byte, length int) (res []interface{}, err error) {
totalConsumed := 0 totalConsumed := 0
result := []interface{}{} result := []interface{}{}
// set a limit to make sure it doesn't loop infinitely for i := 0; totalConsumed < length && i < maxListElements; i++ {
for i := 0; totalConsumed < length && i < 5000; i++ {
elem, consumed, err := decodeRLP(data[totalConsumed:]) elem, consumed, err := decodeRLP(data[totalConsumed:])
if err != nil { if err != nil {
return nil, xerrors.Errorf("invalid rlp data: cannot decode list element: %w", err) return nil, xerrors.Errorf("invalid rlp data: cannot decode list element: %w", err)