aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Corallo <git@bluematt.me>2018-02-06 13:38:54 -0500
committerWladimir J. van der Laan <laanwj@gmail.com>2018-02-08 10:07:28 +0100
commit0f207c488a5165af7e102128f81f02e65a34c531 (patch)
tree9fc055f19e8bf4e6771d3bae44953f1177f21ec2
parent09fc859ef05adb5a3adac8ce9e60790d99375af5 (diff)
downloadbitcoin-0f207c488a5165af7e102128f81f02e65a34c531.tar.xz
Fix fast-shutdown crash if genesis block was not loaded
If the ShutdownRequested() check at the top of ActivateBestChain() returns false during initial genesis block load we will fail an assertion in UTXO DB flush as the best block hash IsNull(). To work around this, we move the check until after one round of ActivateBestChainStep(), ensuring the genesis block gets connected. Github-Pull: #12367 Rebased-From: dd2de47c6288654abb2c3eef29edcd1cc5f39fc9 Tree-SHA512: c2465be25aee327d16d460c9b58d25a5aeedec309f539898e78419bea76dbbe9cde9cc88ec393af38a82e6013d71cce85f4223c9bf04e7244ed619f20f734aa4
-rw-r--r--src/validation.cpp10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/validation.cpp b/src/validation.cpp
index 8cee0dfac3..0e9030c5e0 100644
--- a/src/validation.cpp
+++ b/src/validation.cpp
@@ -2581,9 +2581,6 @@ bool CChainState::ActivateBestChain(CValidationState &state, const CChainParams&
SyncWithValidationInterfaceQueue();
}
- if (ShutdownRequested())
- break;
-
const CBlockIndex *pindexFork;
bool fInitialDownload;
{
@@ -2630,6 +2627,13 @@ bool CChainState::ActivateBestChain(CValidationState &state, const CChainParams&
}
if (nStopAtHeight && pindexNewTip && pindexNewTip->nHeight >= nStopAtHeight) StartShutdown();
+
+ // We check shutdown only after giving ActivateBestChainStep a chance to run once so that we
+ // never shutdown before connecting the genesis block during LoadChainTip(). Previously this
+ // caused an assert() failure during shutdown in such cases as the UTXO DB flushing checks
+ // that the best block hash is non-null.
+ if (ShutdownRequested())
+ break;
} while (pindexNewTip != pindexMostWork);
CheckBlockIndex(chainparams.GetConsensus());