aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCory Fields <cory-nospam-@coryfields.com>2015-03-06 20:26:09 -0500
committerWladimir J. van der Laan <laanwj@gmail.com>2015-03-11 08:34:43 +0100
commit002c8a24119d205b09ee10484097a4b18f4a17a9 (patch)
treee06aa19fa35524ab7e1c2c56c73ab679721c537f
parent200f29363b06cbe8e35dfc5e1b818a0dd96c8474 (diff)
downloadbitcoin-002c8a24119d205b09ee10484097a4b18f4a17a9.tar.xz
fix possible block db breakage during re-index
When re-indexing, there are a few cases where garbage data may be skipped in the block files. In these cases, the indices are correctly written to the index db, however the pointer to the next position for writing in the current block file is calculated by adding the sizes of the valid blocks found. As a result, when the re-index is finished, the index db is correct for all existing blocks, but the next block will be written to an incorrect offset, likely overwriting existing blocks. Rather than using the sum of all valid blocks to determine the next write position, use the end of the last block written to the file. Don't assume that the current block is the last one in the file, since they may be read out-of-order. Rebased-From: bb6acff07982dda68b5c2ac81c99dbd7255bb9cc Github-Pull: #5864
-rw-r--r--src/main.cpp5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 9295c81ce8..172d43c658 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -2362,8 +2362,11 @@ bool FindBlockPos(CValidationState &state, CDiskBlockPos &pos, unsigned int nAdd
}
nLastBlockFile = nFile;
- vinfoBlockFile[nFile].nSize += nAddSize;
vinfoBlockFile[nFile].AddBlock(nHeight, nTime);
+ if (fKnown)
+ vinfoBlockFile[nFile].nSize = std::max(pos.nPos + nAddSize, vinfoBlockFile[nFile].nSize);
+ else
+ vinfoBlockFile[nFile].nSize += nAddSize;
if (!fKnown) {
unsigned int nOldChunks = (pos.nPos + BLOCKFILE_CHUNK_SIZE - 1) / BLOCKFILE_CHUNK_SIZE;