aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSatoshi Nakamoto <satoshin@gmx.com>2010-08-16 20:54:47 +0000
committerGavin Andresen <gavinandresen@gmail.com>2010-08-16 20:54:47 +0000
commit21ca2d833b85673c482803b1c382bbe948b2c44a (patch)
treeac84b90ff3229cf78122eec29aadd118fbb9d7f4
parentbb3fd02930ba5cb8e8a3a92ede9612955edeee05 (diff)
downloadbitcoin-21ca2d833b85673c482803b1c382bbe948b2c44a.tar.xz
erase the bad chain after disconnecting it
-rw-r--r--db.cpp12
1 files changed, 12 insertions, 0 deletions
diff --git a/db.cpp b/db.cpp
index ded78d345b..d83392e52f 100644
--- a/db.cpp
+++ b/db.cpp
@@ -460,9 +460,12 @@ bool CTxDB::LoadBlockIndex()
ReadBestInvalidWork(bnBestInvalidWork);
// Verify blocks in the best chain
+ vector<CBlockIndex*> vChain;
+ vector<CBlockIndex*> vBad;
CBlockIndex* pindexFork = NULL;
for (CBlockIndex* pindex = pindexBest; pindex && pindex->pprev; pindex = pindex->pprev)
{
+ vChain.push_back(pindex);
CBlock block;
if (!block.ReadFromDisk(pindex))
return error("LoadBlockIndex() : block.ReadFromDisk failed");
@@ -470,6 +473,7 @@ bool CTxDB::LoadBlockIndex()
{
printf("LoadBlockIndex() : *** found bad block at %d, hash=%s\n", pindex->nHeight, pindex->GetBlockHash().ToString().c_str());
pindexFork = pindex->pprev;
+ vBad = vChain;
}
}
if (pindexFork)
@@ -480,6 +484,14 @@ bool CTxDB::LoadBlockIndex()
return error("LoadBlockIndex() : block.ReadFromDisk failed");
CTxDB txdb;
block.SetBestChain(txdb, pindexFork);
+
+ // Delete the bad chain
+ foreach(CBlockIndex* pindex, vBad)
+ {
+ txdb.EraseBlockIndex(pindex->GetBlockHash());
+ mapBlockIndex.erase(pindex->GetBlockHash());
+ delete pindex;
+ }
}
return true;