(svn r12707) -Fix: do not crash very hard on unrecognised savegames, just go back to the intro menu instead.
authorrubidium
Mon, 14 Apr 2008 20:00:28 +0000
changeset 10176 86b9f11492da
parent 10175 1119f6640ee6
child 10177 4e88e8bb1918
(svn r12707) -Fix: do not crash very hard on unrecognised savegames, just go back to the intro menu instead.
src/saveload.cpp
--- a/src/saveload.cpp	Mon Apr 14 19:54:33 2008 +0000
+++ b/src/saveload.cpp	Mon Apr 14 20:00:28 2008 +0000
@@ -76,13 +76,24 @@
 
 enum NeedLengthValues {NL_NONE = 0, NL_WANTLENGTH = 1, NL_CALCLENGTH = 2};
 
+/** Error handler, calls longjmp to simulate an exception.
+ * @todo this was used to have a central place to handle errors, but it is
+ * pretty ugly, and seriously interferes with any multithreaded approaches */
+static void NORETURN SlError(StringID string, const char *extra_msg = NULL)
+{
+	_sl.error_str = string;
+	free(_sl.extra_msg);
+	_sl.extra_msg = (extra_msg == NULL) ? NULL : strdup(extra_msg);
+	throw std::exception();
+}
+
 /**
  * Fill the input buffer by reading from the file with the given reader
  */
 static void SlReadFill()
 {
 	uint len = _sl.read_bytes();
-	assert(len != 0);
+	if (len == 0) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME, "Unexpected end of chunk");
 
 	_sl.bufp = _sl.buf;
 	_sl.bufe = _sl.buf + len;
@@ -137,17 +148,6 @@
 	_sl.bufe = _sl.buf + _sl.bufsize;
 }
 
-/** Error handler, calls longjmp to simulate an exception.
- * @todo this was used to have a central place to handle errors, but it is
- * pretty ugly, and seriously interferes with any multithreaded approaches */
-static void NORETURN SlError(StringID string, const char *extra_msg = NULL)
-{
-	_sl.error_str = string;
-	free(_sl.extra_msg);
-	_sl.extra_msg = (extra_msg == NULL) ? NULL : strdup(extra_msg);
-	throw std::exception();
-}
-
 /** Read in a single byte from file. If the temporary buffer is full,
  * flush it to its final destination
  * @return return the read byte from file
@@ -1524,7 +1524,7 @@
 			uint i;
 			uint count = 1 << Savegame_POOL_BLOCK_SIZE_BITS;
 
-			assert(_ts.count == _sl.offs_base);
+			if (_ts.count != _sl.offs_base) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME, "Unexpected size of chunk");
 			for (i = 0; i != _Savegame_pool.GetBlockCount() - 1; i++) {
 				_sl.buf = _Savegame_pool.blocks[i];
 				fmt->writer(count);
@@ -1537,7 +1537,7 @@
 		}
 
 		fmt->uninit_write();
-		assert(_ts.count == _sl.offs_base);
+		if (_ts.count != _sl.offs_base) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME, "Unexpected size of chunk");
 		GetSavegameFormat("memory")->uninit_write(); // clean the memorypool
 		fclose(_sl.fh);