changeset 7100:3b7f7bb62dfc draft

(svn r10367) -Fix: do not crash horribly when the file you are trying to load is too short or decompressing it fails.
author rubidium <rubidium@openttd.org>
date Wed, 27 Jun 2007 23:26:40 +0000
parents d9f437fa153d
children 488bb393b04d
files src/saveload.cpp
diffstat 1 files changed, 7 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/saveload.cpp
+++ b/src/saveload.cpp
@@ -288,6 +288,8 @@
 	_sl.array_index = index;
 }
 
+static uint32 _next_offs;
+
 /**
  * Iterate through the elements of an array and read the whole thing
  * @return The index of the object, or -1 if we have reached the end of current block
@@ -295,21 +297,20 @@
 int SlIterateArray()
 {
 	int index;
-	static uint32 next_offs;
 
 	/* After reading in the whole array inside the loop
 	 * we must have read in all the data, so we must be at end of current block. */
-	assert(next_offs == 0 || SlGetOffs() == next_offs);
+	if (_next_offs != 0 && SlGetOffs() != _next_offs) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME, "Invalid chunk size");
 
 	while (true) {
 		uint length = SlReadArrayLength();
 		if (length == 0) {
-			next_offs = 0;
+			_next_offs = 0;
 			return -1;
 		}
 
 		_sl.obj_len = --length;
-		next_offs = SlGetOffs() + length;
+		_next_offs = SlGetOffs() + length;
 
 		switch (_sl.block_mode) {
 		case CH_SPARSE_ARRAY: index = (int)SlReadSparseIndex(); break;
@@ -1599,6 +1600,8 @@
 	}
 	WaitTillSaved();
 
+	_next_offs = 0;
+
 	/* Load a TTDLX or TTDPatch game */
 	if (mode == SL_OLD_LOAD) {
 		InitializeGame(IG_DATE_RESET, 256, 256); // set a mapsize of 256x256 for TTDPatch games or it might get confused