diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -1597,15 +1597,15 @@ BlockHash hash(uint256S(strHash)); CValidationState state; + CBlockIndex *pblockindex; { LOCK(cs_main); - CBlockIndex *pblockindex = LookupBlockIndex(hash); + pblockindex = LookupBlockIndex(hash); if (!pblockindex) { throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found"); } - - FinalizeBlockAndInvalidate(config, state, pblockindex); } + FinalizeBlockAndInvalidate(config, state, pblockindex); if (state.IsValid()) { ActivateBestChain(config, state); diff --git a/src/validation.h b/src/validation.h --- a/src/validation.h +++ b/src/validation.h @@ -639,8 +639,7 @@ * A finalized block can not be reorged in any way. */ bool FinalizeBlockAndInvalidate(const Config &config, CValidationState &state, - CBlockIndex *pindex) - EXCLUSIVE_LOCKS_REQUIRED(cs_main); + CBlockIndex *pindex); /** Mark a block as invalid. */ bool InvalidateBlock(const Config &config, CValidationState &state, diff --git a/src/validation.cpp b/src/validation.cpp --- a/src/validation.cpp +++ b/src/validation.cpp @@ -3126,26 +3126,29 @@ bool FinalizeBlockAndInvalidate(const Config &config, CValidationState &state, CBlockIndex *pindex) { - AssertLockHeld(cs_main); - if (!FinalizeBlockInternal(config, state, pindex)) { - // state is set by FinalizeBlockInternal. - return false; - } + { + LOCK(cs_main); + if (!FinalizeBlockInternal(config, state, pindex)) { + // state is set by FinalizeBlockInternal. + return false; + } - // We have a valid candidate, make sure it is not parked. - if (pindex->nStatus.isOnParkedChain()) { - UnparkBlock(pindex); + // We have a valid candidate, make sure it is not parked. + if (pindex->nStatus.isOnParkedChain()) { + UnparkBlock(pindex); + } } // If the finalized block is not on the active chain, we need to rewind. - if (!AreOnTheSameFork(pindex, chainActive.Tip())) { - const CBlockIndex *pindexFork = chainActive.FindFork(pindex); - CBlockIndex *pindexToInvalidate = - chainActive.Tip()->GetAncestor(pindexFork->nHeight + 1); - return InvalidateBlock(config, state, pindexToInvalidate); + if (AreOnTheSameFork(pindex, chainActive.Tip())) { + return true; } - return true; + const CBlockIndex *pindexFork = chainActive.FindFork(pindex); + CBlockIndex *pindexToInvalidate = + chainActive.Tip()->GetAncestor(pindexFork->nHeight + 1); + + return InvalidateBlock(config, state, pindexToInvalidate); } bool InvalidateBlock(const Config &config, CValidationState &state,