From a1867a584a054128e8b43c19b358cf8a6c38b8ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Federico=20Kunze=20K=C3=BCllmer?= <31522760+fedekunze@users.noreply.github.com> Date: Fri, 1 Oct 2021 12:58:22 +0200 Subject: [PATCH] rpc: fix panic (#611) * rpc: fix panic * fix * c++ --- CHANGELOG.md | 1 + ethereum/rpc/backend/backend.go | 15 ++++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index babda46e..8f634230 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,6 +43,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Bug Fixes +* (rpc) [tharsis#611](https://github.com/tharsis/ethermint/pull/611) Fix panic on JSON-RPC when querying for an invalid block height. * (cmd) [tharsis#483](https://github.com/tharsis/ethermint/pull/483) Use config values on genesis accounts. ## [v0.6.0] - 2021-09-29 diff --git a/ethereum/rpc/backend/backend.go b/ethereum/rpc/backend/backend.go index e53e5eac..2383cdc4 100644 --- a/ethereum/rpc/backend/backend.go +++ b/ethereum/rpc/backend/backend.go @@ -129,6 +129,11 @@ func (e *EVMBackend) GetBlockByNumber(blockNum types.BlockNumber, fullTx bool) ( return nil, err } + // return if requested block height is greater than the current one + if resBlock == nil || resBlock.Block == nil { + return nil, nil + } + res, err := e.EthBlockFromTendermint(resBlock.Block, fullTx) if err != nil { e.logger.Debug("EthBlockFromTendermint failed", "height", blockNum, "error", err.Error()) @@ -172,18 +177,17 @@ func (e *EVMBackend) GetTendermintBlockByNumber(blockNum types.BlockNumber) (*tm height = 1 default: if blockNum < 0 { - err := errors.Errorf("incorrect block height: %d", height) - return nil, err - } else if height > int64(currentBlockNumber) { + return nil, errors.Errorf("cannot fetch a negative block height: %d", height) + } + if height > int64(currentBlockNumber) { return nil, nil } } resBlock, err := e.clientCtx.Client.Block(e.ctx, &height) if err != nil { - // e.logger.Debug("GetBlockByNumber safely bumping down from %d to latest", height) if resBlock, err = e.clientCtx.Client.Block(e.ctx, nil); err != nil { - e.logger.Debug("GetBlockByNumber failed to get latest block", "error", err.Error()) + e.logger.Debug("tendermint client failed to get latest block", "height", height, "error", err.Error()) return nil, nil } } @@ -192,6 +196,7 @@ func (e *EVMBackend) GetTendermintBlockByNumber(blockNum types.BlockNumber) (*tm e.logger.Debug("GetBlockByNumber block not found", "height", height) return nil, nil } + return resBlock, nil }