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); - pblockindex = LookupBlockIndex(hash); + CBlockIndex *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,7 +639,8 @@ * A finalized block can not be reorged in any way. */ bool FinalizeBlockAndInvalidate(const Config &config, CValidationState &state, - CBlockIndex *pindex); + CBlockIndex *pindex) + EXCLUSIVE_LOCKS_REQUIRED(cs_main); /** 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,29 +3126,26 @@ bool FinalizeBlockAndInvalidate(const Config &config, CValidationState &state, CBlockIndex *pindex) { - { - LOCK(cs_main); - if (!FinalizeBlockInternal(config, state, pindex)) { - // state is set by FinalizeBlockInternal. - return false; - } + AssertLockHeld(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())) { - return true; + if (!AreOnTheSameFork(pindex, chainActive.Tip())) { + const CBlockIndex *pindexFork = chainActive.FindFork(pindex); + CBlockIndex *pindexToInvalidate = + chainActive.Tip()->GetAncestor(pindexFork->nHeight + 1); + return InvalidateBlock(config, state, pindexToInvalidate); } - const CBlockIndex *pindexFork = chainActive.FindFork(pindex); - CBlockIndex *pindexToInvalidate = - chainActive.Tip()->GetAncestor(pindexFork->nHeight + 1); - - return InvalidateBlock(config, state, pindexToInvalidate); + return true; } bool InvalidateBlock(const Config &config, CValidationState &state,