diff options
author | rubidium <rubidium@openttd.org> | 2010-07-08 18:45:52 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2010-07-08 18:45:52 +0000 |
commit | 72bfda4634fa599479c7fcd8026642362c58ef58 (patch) | |
tree | ea7cc0f64feb92272744318b8e65aed511b26670 | |
parent | 4ce5c6d93dea944df7de559ea62b625a3643ce52 (diff) | |
download | openttd-72bfda4634fa599479c7fcd8026642362c58ef58.tar.xz |
(svn r20090) -Fix: savegames would (very likely) end with 128 KiB worth of useless zeros
-rw-r--r-- | src/saveload/saveload.cpp | 22 |
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(); |