Skip to content

Commit a6a90d4

Browse files
authored
fix panic when block tag greater than MaxInt64 is provided in parameters (#92)
1 parent c6a34b0 commit a6a90d4

File tree

2 files changed

+38
-7
lines changed

2 files changed

+38
-7
lines changed

decode/evm_rpc.go

+16-7
Original file line numberDiff line numberDiff line change
@@ -333,15 +333,24 @@ func ParseBlockNumberFromParams(methodName string, params []interface{}) (int64,
333333
}
334334

335335
blockNumber, exists := BlockTagToNumberCodec[tag]
336+
if exists {
337+
return blockNumber, nil
338+
}
336339

337-
if !exists {
338-
spaceint, valid := cosmosmath.NewIntFromString(tag)
339-
if !valid {
340-
return 0, fmt.Errorf(fmt.Sprintf("unable to parse tag %s to integer", tag))
341-
}
340+
return blockParamToInt64(tag)
341+
}
342+
343+
// blockParamToInt64 converts a 0x prefixed base 16 or no-prefixed base 10 string to int64
344+
// and returns an error if value is unable to be converted or out of bounds
345+
func blockParamToInt64(blockParam string) (int64, error) {
346+
result, valid := cosmosmath.NewIntFromString(blockParam)
347+
if !valid {
348+
return 0, fmt.Errorf("unable to parse tag %s to integer", blockParam)
349+
}
342350

343-
blockNumber = spaceint.Int64()
351+
if !result.IsInt64() {
352+
return 0, fmt.Errorf("value %s out of range", blockParam)
344353
}
345354

346-
return blockNumber, nil
355+
return result.Int64(), nil
347356
}

decode/evm_rpc_test.go

+22
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,28 @@ func TestUnitTest_ParseBlockNumberFromParams(t *testing.T) {
242242
expectedBlockNumber: 0,
243243
expectedErr: "error decoding block number param from params",
244244
},
245+
{
246+
name: "errors on base10 int64 overflow",
247+
req: EVMRPCRequestEnvelope{
248+
Method: "eth_getBlockByNumber",
249+
Params: []interface{}{
250+
"9223372036854775808", false,
251+
},
252+
},
253+
expectedBlockNumber: 0,
254+
expectedErr: "out of range",
255+
},
256+
{
257+
name: "errors on base16 int64 overflow",
258+
req: EVMRPCRequestEnvelope{
259+
Method: "eth_getBlockByNumber",
260+
Params: []interface{}{
261+
"0x8000000000000000", false,
262+
},
263+
},
264+
expectedBlockNumber: 0,
265+
expectedErr: "out of range",
266+
},
245267
}
246268

247269
for _, tc := range testCases {

0 commit comments

Comments
 (0)