trying to fix infinite recursion in SetBestChain

This commit is contained in:
Miguel Freitas 2014-01-12 23:44:33 -02:00
parent ba43f10e8f
commit 77d1a4fb7b
2 changed files with 16 additions and 3 deletions

View File

@ -924,8 +924,11 @@ bool AppInit2(boost::thread_group& threadGroup)
// scan for better chains in the block chain database, that are not yet connected in the active best chain // scan for better chains in the block chain database, that are not yet connected in the active best chain
CValidationState state; CValidationState state;
if (!ConnectBestBlock(state)) if (!ConnectBestBlock(state)) {
strErrors << "Failed to connect best block"; // try again before giving up
if (!ConnectBestBlock(state))
strErrors << "Failed to connect best block (try -reindex)";
}
std::vector<boost::filesystem::path> vImportFiles; std::vector<boost::filesystem::path> vImportFiles;
if (mapArgs.count("-loadblock")) if (mapArgs.count("-loadblock"))

View File

@ -1150,7 +1150,7 @@ bool ConnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex, C
CTransaction txPubKey; CTransaction txPubKey;
uint256 hashBlock; uint256 hashBlock;
if( !GetTransaction(spamUser, txPubKey, hashBlock, block.nHeight) ) if( !GetTransaction(spamUser, txPubKey, hashBlock, block.nHeight) )
return state.DoS(100, error("ConnectBlock() : spam signed by unknown user")); return state.DoS(100, error("ConnectBlock() : spam signed by unknown user %s", spamUser.c_str()));
std::vector< std::vector<unsigned char> > vData; std::vector< std::vector<unsigned char> > vData;
if( !txPubKey.pubKey.ExtractPushData(vData) || vData.size() < 1 ) if( !txPubKey.pubKey.ExtractPushData(vData) || vData.size() < 1 )
@ -1336,6 +1336,16 @@ bool SetBestChain(CValidationState &state, CBlockIndex* pindexNew)
int64 nStart = GetTimeMicros(); int64 nStart = GetTimeMicros();
if (!ConnectBlock(block, state, pindex, view)) { if (!ConnectBlock(block, state, pindex, view)) {
if (state.IsInvalid()) { if (state.IsInvalid()) {
// [MF] invalidate all pindex between pindexNew and pindex
// trying to fix infinite recursion in SetBestChain.
CBlockIndex *pinvalid = pindexNew;
do {
pinvalid->nStatus |= BLOCK_FAILED_CHILD;
pblocktree->WriteBlockIndex(CDiskBlockIndex(pinvalid));
setBlockIndexValid.erase(pinvalid);
pinvalid = pinvalid->pprev;
} while( pinvalid != NULL && pinvalid != pindex);
InvalidChainFound(pindexNew); InvalidChainFound(pindexNew);
InvalidBlockFound(pindex); InvalidBlockFound(pindex);
} }