mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-20 07:09:15 +01:00
Sanity assert GetAncestor() != nullptr where appropriate
Add sanity asserts for return value of `CBlockIndex::GetAncestor()` where appropriate. In validation.cpp `CheckSequenceLocks`, check the return value of `tip->GetAncestor(maxInputHeight)` stored into `lp->maxInputBlock`. If it ever returns `nullptr` because the ancestor isn't found, it's going to be a bad bug to keep going, since a `LockPoints` object with the `maxInputBlock` member set to `nullptr` signifies no relative lock time. In the other places, the added asserts would prevent accidental dereferencing of a null pointer which is undefined behavior. Co-Authored-By: Aurèle Oulès <aurele@oules.com> Co-Authored-By: danra <danra@users.noreply.github.com>
This commit is contained in:
@@ -246,7 +246,12 @@ bool CheckSequenceLocksAtTip(CBlockIndex* tip,
|
||||
maxInputHeight = std::max(maxInputHeight, height);
|
||||
}
|
||||
}
|
||||
lp->maxInputBlock = tip->GetAncestor(maxInputHeight);
|
||||
// tip->GetAncestor(maxInputHeight) should never return a nullptr
|
||||
// because maxInputHeight is always less than the tip height.
|
||||
// It would, however, be a bad bug to continue execution, since a
|
||||
// LockPoints object with the maxInputBlock member set to nullptr
|
||||
// signifies no relative lock time.
|
||||
lp->maxInputBlock = Assert(tip->GetAncestor(maxInputHeight));
|
||||
}
|
||||
}
|
||||
return EvaluateSequenceLocks(index, lockPair);
|
||||
@@ -4077,10 +4082,11 @@ bool CChainState::ReplayBlocks()
|
||||
// Roll forward from the forking point to the new tip.
|
||||
int nForkHeight = pindexFork ? pindexFork->nHeight : 0;
|
||||
for (int nHeight = nForkHeight + 1; nHeight <= pindexNew->nHeight; ++nHeight) {
|
||||
const CBlockIndex* pindex = pindexNew->GetAncestor(nHeight);
|
||||
LogPrintf("Rolling forward %s (%i)\n", pindex->GetBlockHash().ToString(), nHeight);
|
||||
const CBlockIndex& pindex{*Assert(pindexNew->GetAncestor(nHeight))};
|
||||
|
||||
LogPrintf("Rolling forward %s (%i)\n", pindex.GetBlockHash().ToString(), nHeight);
|
||||
uiInterface.ShowProgress(_("Replaying blocks…").translated, (int) ((nHeight - nForkHeight) * 100.0 / (pindexNew->nHeight - nForkHeight)) , false);
|
||||
if (!RollforwardBlock(pindex, cache)) return false;
|
||||
if (!RollforwardBlock(&pindex, cache)) return false;
|
||||
}
|
||||
|
||||
cache.SetBestBlock(pindexNew->GetBlockHash());
|
||||
|
||||
Reference in New Issue
Block a user