mirror of https://github.com/OpenTTD/OpenTTD
(svn r10367) -Fix: do not crash horribly when the file you are trying to load is too short or decompressing it fails.
parent
15bf8e1e58
commit
e0a94a94a5
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue