From 72e5122e73ef981a1cd95d97aac1f1cf7de1f691 Mon Sep 17 00:00:00 2001 From: Federico Gimenez Date: Wed, 8 May 2024 15:21:16 +0200 Subject: [PATCH] fix: prevents potential arithmetic underflow (#8156) --- crates/blockchain-tree/src/chain.rs | 3 ++- crates/interfaces/src/blockchain_tree/error.rs | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/crates/blockchain-tree/src/chain.rs b/crates/blockchain-tree/src/chain.rs index 637ea52e7e..db4b4627ab 100644 --- a/crates/blockchain-tree/src/chain.rs +++ b/crates/blockchain-tree/src/chain.rs @@ -119,7 +119,8 @@ impl AppendableChain { DB: Database + Clone, E: BlockExecutorProvider, { - let parent_number = block.number - 1; + let parent_number = + block.number.checked_sub(1).ok_or(BlockchainTreeError::GenesisBlockHasNoParent)?; let parent = self.blocks().get(&parent_number).ok_or( BlockchainTreeError::BlockNumberNotFoundInChain { block_number: parent_number }, )?; diff --git a/crates/interfaces/src/blockchain_tree/error.rs b/crates/interfaces/src/blockchain_tree/error.rs index e9cdb8714d..a98d765014 100644 --- a/crates/interfaces/src/blockchain_tree/error.rs +++ b/crates/interfaces/src/blockchain_tree/error.rs @@ -47,6 +47,9 @@ pub enum BlockchainTreeError { /// The block hash of the block that failed to buffer. block_hash: BlockHash, }, + /// Thrown when trying to access genesis parent. + #[error("genesis block has no parent")] + GenesisBlockHasNoParent, } /// Canonical Errors @@ -318,7 +321,8 @@ impl InsertBlockErrorKind { BlockchainTreeError::CanonicalChain { .. } | BlockchainTreeError::BlockNumberNotFoundInChain { .. } | BlockchainTreeError::BlockHashNotFoundInChain { .. } | - BlockchainTreeError::BlockBufferingFailed { .. } => false, + BlockchainTreeError::BlockBufferingFailed { .. } | + BlockchainTreeError::GenesisBlockHasNoParent => false, } } InsertBlockErrorKind::Provider(_) | InsertBlockErrorKind::Internal(_) => {