Merge #20921: validation: don't try to invalidate genesis block in CChainState::InvalidateBlock

787df19b09babf50dd8124b3ac990b29c33cfe93 validation: don't try to invalidate genesis block (Sebastian Falbesoner)

Pull request description:

  In the block invalidation method (`CChainState::InvalidateBlock`), the code for creating the candidate block map assumes that the passed block's previous block (`pindex->pprev`) is available and otherwise segfaults due to null-pointer deference in `CBlockIndexWorkComparator()` (see analysis by practicalswift in #20914), i.e. it doesn't work with the genesis block. Rather than analyzing all possible code paths and implications for this corner case, simply fail early if the genesis block is passed.

  Fixes #20914.

ACKs for top commit:
  sipa:
    ACK 787df19b09babf50dd8124b3ac990b29c33cfe93. Tested invalidation of generic on regtest.
  practicalswift:
    Tested ACK 787df19b09babf50dd8124b3ac990b29c33cfe93

Tree-SHA512: 978be7cf2bd1c1faebfe945d191ac77dea72791bea826459abd308f77c74c5991efee495a38817c306e488ecd5208b5c888df7d9d044132dd9a06bbbdb256b6c
This commit is contained in:
MarcoFalke 2021-03-20 12:46:08 +01:00 committed by Pasta
parent c804e42ddf
commit e1675bdd84
No known key found for this signature in database
GPG Key ID: 52527BEDABE87984

View File

@ -3202,6 +3202,10 @@ bool PreciousBlock(CValidationState& state, const CChainParams& params, CBlockIn
bool CChainState::InvalidateBlock(CValidationState& state, const CChainParams& chainparams, CBlockIndex *pindex) bool CChainState::InvalidateBlock(CValidationState& state, const CChainParams& chainparams, CBlockIndex *pindex)
{ {
// Genesis block can't be invalidated
assert(pindex);
if (pindex->nHeight == 0) return false;
CBlockIndex* to_mark_failed = pindex; CBlockIndex* to_mark_failed = pindex;
bool pindex_was_in_chain = false; bool pindex_was_in_chain = false;
int disconnected = 0; int disconnected = 0;