summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2010-07-08 18:45:52 +0000
committerrubidium <rubidium@openttd.org>2010-07-08 18:45:52 +0000
commit72bfda4634fa599479c7fcd8026642362c58ef58 (patch)
treeea7cc0f64feb92272744318b8e65aed511b26670
parent4ce5c6d93dea944df7de559ea62b625a3643ce52 (diff)
downloadopenttd-72bfda4634fa599479c7fcd8026642362c58ef58.tar.xz
(svn r20090) -Fix: savegames would (very likely) end with 128 KiB worth of useless zeros
-rw-r--r--src/saveload/saveload.cpp22
1 files changed, 13 insertions, 9 deletions
diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp
index 19883c96e..a9d1e9f1e 100644
--- a/src/saveload/saveload.cpp
+++ b/src/saveload/saveload.cpp
@@ -1454,7 +1454,7 @@ struct ThreadedSave {
};
/** Save in chunks of 128 KiB. */
-static const int MEMORY_CHUNK_SIZE = 128 * 1024;
+static const size_t MEMORY_CHUNK_SIZE = 128 * 1024;
/** Memory allocation for storing savegames in memory. */
static AutoFreeSmallVector<byte *, 16> _memory_savegame;
@@ -1855,19 +1855,23 @@ static SaveOrLoadResult SaveFileToDisk(bool threaded)
if (!fmt->init_write(compression)) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR, "cannot initialize compressor");
- {
- uint i;
+ uint i = 0;
+ size_t t = _ts.count;
- if (_ts.count != _sl.offs_base) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME, "Unexpected size of chunk");
- for (i = 0; i != _memory_savegame.Length() - 1; i++) {
- _sl.buf = _memory_savegame[i];
- fmt->writer(MEMORY_CHUNK_SIZE);
- }
+ if (_ts.count != _sl.offs_base) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME, "Unexpected size of chunk");
+ while (t >= MEMORY_CHUNK_SIZE) {
+ _sl.buf = _memory_savegame[i++];
+ fmt->writer(MEMORY_CHUNK_SIZE);
+ t -= MEMORY_CHUNK_SIZE;
+ }
+ if (t != 0) {
/* The last block is (almost) always not fully filled, so only write away
* as much data as it is in there */
_sl.buf = _memory_savegame[i];
- fmt->writer(_ts.count % MEMORY_CHUNK_SIZE);
+
+ assert(t == _ts.count % MEMORY_CHUNK_SIZE);
+ fmt->writer(t);
}
fmt->uninit_write();