(svn r10367) -Fix: do not crash horribly when the file you are trying to load is too short or decompressing it fails.
authorrubidium
Wed, 27 Jun 2007 23:26:40 +0000
changeset 7596 c145bb65405e
parent 7595 7931b084aa70
child 7597 73cfa9943246
(svn r10367) -Fix: do not crash horribly when the file you are trying to load is too short or decompressing it fails.
src/saveload.cpp
--- a/src/saveload.cpp	Wed Jun 27 22:29:57 2007 +0000
+++ b/src/saveload.cpp	Wed Jun 27 23:26:40 2007 +0000
@@ -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