0
0
Fork 0
mirror of https://github.com/bitcoin/bitcoin.git synced 2025-03-05 14:06:27 -05:00

Guard CBlockIndex::nStatus/nFile/nDataPos/nUndoPos by cs_main

Co-authored-by: Vasil Dimov <vd@FreeBSD.org>
This commit is contained in:
Jon Atack 2022-01-19 13:42:32 +01:00
parent 5d59ae0ba8
commit 6ea5682784
No known key found for this signature in database
GPG key ID: 796C4109063D4EAF
5 changed files with 19 additions and 11 deletions

View file

@ -164,13 +164,13 @@ public:
int nHeight{0}; int nHeight{0};
//! Which # file this block is stored in (blk?????.dat) //! Which # file this block is stored in (blk?????.dat)
int nFile{0}; int nFile GUARDED_BY(::cs_main){0};
//! Byte offset within blk?????.dat where this block's data is stored //! Byte offset within blk?????.dat where this block's data is stored
unsigned int nDataPos{0}; unsigned int nDataPos GUARDED_BY(::cs_main){0};
//! Byte offset within rev?????.dat where this block's undo data is stored //! Byte offset within rev?????.dat where this block's undo data is stored
unsigned int nUndoPos{0}; unsigned int nUndoPos GUARDED_BY(::cs_main){0};
//! (memory only) Total amount of work (expected number of hashes) in the chain up to and including this block //! (memory only) Total amount of work (expected number of hashes) in the chain up to and including this block
arith_uint256 nChainWork{}; arith_uint256 nChainWork{};
@ -198,7 +198,7 @@ public:
//! load to avoid the block index being spuriously rewound. //! load to avoid the block index being spuriously rewound.
//! @sa NeedsRedownload //! @sa NeedsRedownload
//! @sa ActivateSnapshot //! @sa ActivateSnapshot
uint32_t nStatus{0}; uint32_t nStatus GUARDED_BY(::cs_main){0};
//! block header //! block header
int32_t nVersion{0}; int32_t nVersion{0};
@ -382,6 +382,7 @@ public:
SERIALIZE_METHODS(CDiskBlockIndex, obj) SERIALIZE_METHODS(CDiskBlockIndex, obj)
{ {
LOCK(::cs_main);
int _nVersion = s.GetVersion(); int _nVersion = s.GetVersion();
if (!(s.GetType() & SER_GETHASH)) READWRITE(VARINT_MODE(_nVersion, VarIntMode::NONNEGATIVE_SIGNED)); if (!(s.GetType() & SER_GETHASH)) READWRITE(VARINT_MODE(_nVersion, VarIntMode::NONNEGATIVE_SIGNED));

View file

@ -818,7 +818,8 @@ static RPCHelpMan getblockfrompeer()
throw JSONRPCError(RPC_MISC_ERROR, "Block header missing"); throw JSONRPCError(RPC_MISC_ERROR, "Block header missing");
} }
if (index->nStatus & BLOCK_HAVE_DATA) { const bool block_has_data = WITH_LOCK(::cs_main, return index->nStatus & BLOCK_HAVE_DATA);
if (block_has_data) {
throw JSONRPCError(RPC_MISC_ERROR, "Block already downloaded"); throw JSONRPCError(RPC_MISC_ERROR, "Block already downloaded");
} }

View file

@ -240,7 +240,8 @@ static RPCHelpMan getrawtransaction()
if (!tx) { if (!tx) {
std::string errmsg; std::string errmsg;
if (blockindex) { if (blockindex) {
if (!(blockindex->nStatus & BLOCK_HAVE_DATA)) { const bool block_has_data = WITH_LOCK(::cs_main, return blockindex->nStatus & BLOCK_HAVE_DATA);
if (!block_has_data) {
throw JSONRPCError(RPC_MISC_ERROR, "Block not available"); throw JSONRPCError(RPC_MISC_ERROR, "Block not available");
} }
errmsg = "No such transaction found in the provided block"; errmsg = "No such transaction found in the provided block";

View file

@ -123,6 +123,7 @@ BOOST_AUTO_TEST_CASE(findCommonAncestor)
BOOST_AUTO_TEST_CASE(hasBlocks) BOOST_AUTO_TEST_CASE(hasBlocks)
{ {
LOCK(::cs_main);
auto& chain = m_node.chain; auto& chain = m_node.chain;
const CChain& active = Assert(m_node.chainman)->ActiveChain(); const CChain& active = Assert(m_node.chainman)->ActiveChain();

View file

@ -311,19 +311,23 @@ bool CBlockTreeDB::LoadBlockIndexGuts(const Consensus::Params& consensusParams,
CBlockIndex* pindexNew = insertBlockIndex(diskindex.GetBlockHash()); CBlockIndex* pindexNew = insertBlockIndex(diskindex.GetBlockHash());
pindexNew->pprev = insertBlockIndex(diskindex.hashPrev); pindexNew->pprev = insertBlockIndex(diskindex.hashPrev);
pindexNew->nHeight = diskindex.nHeight; pindexNew->nHeight = diskindex.nHeight;
pindexNew->nFile = diskindex.nFile;
pindexNew->nDataPos = diskindex.nDataPos;
pindexNew->nUndoPos = diskindex.nUndoPos;
pindexNew->nVersion = diskindex.nVersion; pindexNew->nVersion = diskindex.nVersion;
pindexNew->hashMerkleRoot = diskindex.hashMerkleRoot; pindexNew->hashMerkleRoot = diskindex.hashMerkleRoot;
pindexNew->nTime = diskindex.nTime; pindexNew->nTime = diskindex.nTime;
pindexNew->nBits = diskindex.nBits; pindexNew->nBits = diskindex.nBits;
pindexNew->nNonce = diskindex.nNonce; pindexNew->nNonce = diskindex.nNonce;
pindexNew->nStatus = diskindex.nStatus;
pindexNew->nTx = diskindex.nTx; pindexNew->nTx = diskindex.nTx;
{
LOCK(::cs_main);
pindexNew->nFile = diskindex.nFile;
pindexNew->nDataPos = diskindex.nDataPos;
pindexNew->nUndoPos = diskindex.nUndoPos;
pindexNew->nStatus = diskindex.nStatus;
}
if (!CheckProofOfWork(pindexNew->GetBlockHash(), pindexNew->nBits, consensusParams)) if (!CheckProofOfWork(pindexNew->GetBlockHash(), pindexNew->nBits, consensusParams)) {
return error("%s: CheckProofOfWork failed: %s", __func__, pindexNew->ToString()); return error("%s: CheckProofOfWork failed: %s", __func__, pindexNew->ToString());
}
pcursor->Next(); pcursor->Next();
} else { } else {