Skip to content

Commit eaeeb88

Browse files
jonatackvasild
andcommitted
Require IsBlockPruned() to hold mutex cs_main
Co-authored-by: Vasil Dimov <[email protected]>
1 parent ca47b00 commit eaeeb88

File tree

3 files changed

+7
-4
lines changed

3 files changed

+7
-4
lines changed

src/node/blockstorage.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,7 @@ CBlockIndex* BlockManager::GetLastCheckpoint(const CCheckpointData& data)
429429

430430
bool IsBlockPruned(const CBlockIndex* pblockindex)
431431
{
432+
AssertLockHeld(::cs_main);
432433
return (fHavePruned && !(pblockindex->nStatus & BLOCK_HAVE_DATA) && pblockindex->nTx > 0);
433434
}
434435

src/node/blockstorage.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ class BlockManager
167167
};
168168

169169
//! Check whether the block associated with this index entry is pruned or not.
170-
bool IsBlockPruned(const CBlockIndex* pblockindex);
170+
bool IsBlockPruned(const CBlockIndex* pblockindex) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
171171

172172
void CleanupBlockRevFiles();
173173

src/rpc/blockchain.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ UniValue blockToJSON(const CBlock& block, const CBlockIndex* tip, const CBlockIn
185185
case TxVerbosity::SHOW_DETAILS:
186186
case TxVerbosity::SHOW_DETAILS_AND_PREVOUT:
187187
CBlockUndo blockUndo;
188-
const bool have_undo = !IsBlockPruned(blockindex) && UndoReadFromDisk(blockUndo, blockindex);
188+
const bool have_undo{WITH_LOCK(::cs_main, return !IsBlockPruned(blockindex) && UndoReadFromDisk(blockUndo, blockindex))};
189189

190190
for (size_t i = 0; i < block.vtx.size(); ++i) {
191191
const CTransactionRef& tx = block.vtx.at(i);
@@ -929,8 +929,9 @@ static RPCHelpMan getblockheader()
929929
};
930930
}
931931

932-
static CBlock GetBlockChecked(const CBlockIndex* pblockindex)
932+
static CBlock GetBlockChecked(const CBlockIndex* pblockindex) EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
933933
{
934+
AssertLockHeld(::cs_main);
934935
CBlock block;
935936
if (IsBlockPruned(pblockindex)) {
936937
throw JSONRPCError(RPC_MISC_ERROR, "Block not available (pruned data)");
@@ -946,8 +947,9 @@ static CBlock GetBlockChecked(const CBlockIndex* pblockindex)
946947
return block;
947948
}
948949

949-
static CBlockUndo GetUndoChecked(const CBlockIndex* pblockindex)
950+
static CBlockUndo GetUndoChecked(const CBlockIndex* pblockindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
950951
{
952+
AssertLockHeld(::cs_main);
951953
CBlockUndo blockUndo;
952954
if (IsBlockPruned(pblockindex)) {
953955
throw JSONRPCError(RPC_MISC_ERROR, "Undo data not available (pruned data)");

0 commit comments

Comments
 (0)