Changeset - r15577:a61e44bed2f3
[Not reviewed]
master
0 3 0
rubidium - 14 years ago 2010-07-30 22:57:46
rubidium@openttd.org
(svn r20247) -Fix: when it is known the loading an old savegame is going to fail, bail out immediately (using an exception) instead of going on until e.g. the expected number of byte is read
3 files changed with 25 insertions and 13 deletions:
0 comments (0 inline, 0 general)
src/saveload/oldloader.cpp
Show inline comments
 
@@ -22,6 +22,8 @@
 
#include "saveload_internal.h"
 
#include "oldloader.h"
 

	
 
#include <exception>
 

	
 
static const int TTO_HEADER_SIZE = 41;
 
static const int TTD_HEADER_SIZE = 49;
 

	
 
@@ -49,13 +51,14 @@ static byte ReadByteFromFile(LoadgameSta
 
	/* To avoid slow reads, we read BUFFER_SIZE of bytes per time
 
	and just return a byte per time */
 
	if (ls->buffer_cur >= ls->buffer_count) {
 

	
 
		/* Read some new bytes from the file */
 
		int count = (int)fread(ls->buffer, 1, BUFFER_SIZE, ls->file);
 

	
 
		/* We tried to read, but there is nothing in the file anymore.. */
 
		if (count == 0) {
 
			DEBUG(oldloader, 0, "Read past end of file, loading failed");
 
			ls->failed = true;
 
			throw std::exception();
 
		}
 

	
 
		ls->buffer_count = count;
 
@@ -119,8 +122,6 @@ bool LoadChunk(LoadgameState *ls, void *
 
		if (chunk->type & OC_DEREFERENCE_POINTER) ptr = *(byte**)ptr;
 

	
 
		for (uint i = 0; i < chunk->amount; i++) {
 
			if (ls->failed) return false;
 

	
 
			/* Handle simple types */
 
			if (GetOldChunkType(chunk->type) != 0) {
 
				switch (GetOldChunkType(chunk->type)) {
 
@@ -135,7 +136,7 @@ bool LoadChunk(LoadgameState *ls, void *
 

	
 
					case OC_ASSERT:
 
						DEBUG(oldloader, 4, "Assert point: 0x%X / 0x%X", ls->total_read, chunk->offset + _bump_assert_value);
 
						if (ls->total_read != chunk->offset + _bump_assert_value) ls->failed = true;
 
						if (ls->total_read != chunk->offset + _bump_assert_value) throw std::exception();
 
					default: break;
 
				}
 
			} else {
 
@@ -189,7 +190,6 @@ static void InitLoading(LoadgameState *l
 
{
 
	ls->chunk_size   = 0;
 
	ls->total_read   = 0;
 
	ls->failed       = false;
 

	
 
	ls->decoding     = false;
 
	ls->decode_char  = 0;
 
@@ -301,7 +301,14 @@ bool LoadOldSaveGame(const char *file)
 

	
 
	_savegame_type = type;
 

	
 
	if (proc == NULL || !proc(&ls)) {
 
	bool game_loaded;
 
	try {
 
		game_loaded = proc != NULL && proc(&ls);
 
	} catch (...) {
 
		game_loaded = false;
 
	}
 

	
 
	if (!game_loaded) {
 
		SetSaveLoadError(STR_GAME_SAVELOAD_ERROR_DATA_INTEGRITY_CHECK_FAILED);
 
		fclose(ls.file);
 
		return false;
src/saveload/oldloader.h
Show inline comments
 
@@ -31,7 +31,6 @@ struct LoadgameState {
 
	byte buffer[BUFFER_SIZE];
 

	
 
	uint total_read;
 
	bool failed;
 
};
 

	
 
/* OldChunk-Type */
src/saveload/oldloader_sl.cpp
Show inline comments
 
@@ -1479,7 +1479,7 @@ static bool LoadOldMapPart1(LoadgameStat
 
		}
 
	}
 

	
 
	return !ls->failed;
 
	return true;
 
}
 

	
 
static bool LoadOldMapPart2(LoadgameState *ls, int num)
 
@@ -1493,7 +1493,7 @@ static bool LoadOldMapPart2(LoadgameStat
 
		_m[i].m5 = ReadByte(ls);
 
	}
 

	
 
	return !ls->failed;
 
	return true;
 
}
 

	
 
static bool LoadTTDPatchExtraChunks(LoadgameState *ls, int num)
 
@@ -1548,7 +1548,7 @@ static bool LoadTTDPatchExtraChunks(Load
 
		}
 
	}
 

	
 
	return !ls->failed;
 
	return true;
 
}
 

	
 
extern TileIndex _cur_tileloop_tile;
 
@@ -1734,11 +1734,17 @@ bool LoadTTDMain(LoadgameState *ls)
 
	SmallStackSafeStackAlloc<byte, OLD_MAP_SIZE * 2> map3;
 
	_old_map3 = map3.data;
 
	_old_vehicle_names = NULL;
 
	if (!LoadChunk(ls, NULL, main_chunk)) {
 
		DEBUG(oldloader, 0, "Loading failed");
 
	try {
 
		if (!LoadChunk(ls, NULL, main_chunk)) {
 
			DEBUG(oldloader, 0, "Loading failed");
 
			free(_old_vehicle_names);
 
			return false;
 
		}
 
	} catch (...) {
 
		free(_old_vehicle_names);
 
		return false;
 
		throw;
 
	}
 

	
 
	DEBUG(oldloader, 3, "Done, converting game data...");
 

	
 
	FixTTDMapArray();
0 comments (0 inline, 0 general)