From e0a94a94a56a5e40b1ee772581794ff4a07c72e7 Mon Sep 17 00:00:00 2001 From: rubidium Date: Wed, 27 Jun 2007 23:26:40 +0000 Subject: (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 | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/saveload.cpp b/src/saveload.cpp index 4fe005941..71417ea07 100644 --- a/src/saveload.cpp +++ b/src/saveload.cpp @@ -288,6 +288,8 @@ void SlSetArrayIndex(uint index) _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 @@ void SlSetArrayIndex(uint index) 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 @@ SaveOrLoadResult SaveOrLoad(const char *filename, int mode, Subdirectory sb) } 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 -- cgit v1.2.3-54-g00ecf