From b5dec963708198d33664d261681cfffc06bc65a4 Mon Sep 17 00:00:00 2001 From: Patrick Lodder Date: Wed, 9 Oct 2024 15:34:16 -0400 Subject: [PATCH] bugfix: change asserts into handled failures for cmpctblk Replaces assert() calls with if() statements returning functional failure that can be handled for situations that can be triggered from outside of compiled code - i.e. peers. Cherry-picked from: 149be06d Github Pull Request: #3661 --- src/blockencodings.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/blockencodings.cpp b/src/blockencodings.cpp index ef27877c6..95966ab4f 100644 --- a/src/blockencodings.cpp +++ b/src/blockencodings.cpp @@ -53,7 +53,10 @@ ReadStatus PartiallyDownloadedBlock::InitData(const CBlockHeaderAndShortTxIDs& c if (cmpctblock.shorttxids.size() + cmpctblock.prefilledtxn.size() > MAX_BLOCK_BASE_SIZE / MIN_TRANSACTION_BASE_SIZE) return READ_STATUS_INVALID; - assert(header.IsNull() && txn_available.empty()); + if (!header.IsNull() || !txn_available.empty()) { + return READ_STATUS_FAILED; + } + header = cmpctblock.header; txn_available.resize(cmpctblock.BlockTxCount()); @@ -170,13 +173,19 @@ ReadStatus PartiallyDownloadedBlock::InitData(const CBlockHeaderAndShortTxIDs& c } bool PartiallyDownloadedBlock::IsTxAvailable(size_t index) const { - assert(!header.IsNull()); + if (header.IsNull()) { + return false; + } + assert(index < txn_available.size()); return txn_available[index] ? true : false; } ReadStatus PartiallyDownloadedBlock::FillBlock(CBlock& block, const std::vector& vtx_missing) { - assert(!header.IsNull()); + if (header.IsNull()) { + return READ_STATUS_INVALID; + } + uint256 hash = header.GetHash(); block = header; block.vtx.resize(txn_available.size());