1
0
Fork 0

(svn r10367) -Fix: do not crash horribly when the file you are trying to load is too short or decompressing it fails.

release/0.6
rubidium 2007-06-27 23:26:40 +00:00
parent 15bf8e1e58
commit e0a94a94a5
1 changed files with 7 additions and 4 deletions

View File

@ -288,6 +288,8 @@ void SlSetArrayIndex(uint index)
_sl.array_index = index; _sl.array_index = index;
} }
static uint32 _next_offs;
/** /**
* Iterate through the elements of an array and read the whole thing * 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 * @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 SlIterateArray()
{ {
int index; int index;
static uint32 next_offs;
/* After reading in the whole array inside the loop /* 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. */ * 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) { while (true) {
uint length = SlReadArrayLength(); uint length = SlReadArrayLength();
if (length == 0) { if (length == 0) {
next_offs = 0; _next_offs = 0;
return -1; return -1;
} }
_sl.obj_len = --length; _sl.obj_len = --length;
next_offs = SlGetOffs() + length; _next_offs = SlGetOffs() + length;
switch (_sl.block_mode) { switch (_sl.block_mode) {
case CH_SPARSE_ARRAY: index = (int)SlReadSparseIndex(); break; case CH_SPARSE_ARRAY: index = (int)SlReadSparseIndex(); break;
@ -1599,6 +1600,8 @@ SaveOrLoadResult SaveOrLoad(const char *filename, int mode, Subdirectory sb)
} }
WaitTillSaved(); WaitTillSaved();
_next_offs = 0;
/* Load a TTDLX or TTDPatch game */ /* Load a TTDLX or TTDPatch game */
if (mode == SL_OLD_LOAD) { if (mode == SL_OLD_LOAD) {
InitializeGame(IG_DATE_RESET, 256, 256); // set a mapsize of 256x256 for TTDPatch games or it might get confused InitializeGame(IG_DATE_RESET, 256, 256); // set a mapsize of 256x256 for TTDPatch games or it might get confused