summaryrefslogtreecommitdiff
path: root/src/saveload/oldloader.cpp
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2010-07-30 22:57:46 +0000
committerrubidium <rubidium@openttd.org>2010-07-30 22:57:46 +0000
commit24df43633cb1f647f71867512ce4cbc9f9672561 (patch)
tree4a374e67bd1e75bc2c33887c9e9c12ce8b7bbf8e /src/saveload/oldloader.cpp
parent3aaeb311df8d720b0fd4449e3f9a4d7cd35a4ac0 (diff)
downloadopenttd-24df43633cb1f647f71867512ce4cbc9f9672561.tar.xz
(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
Diffstat (limited to 'src/saveload/oldloader.cpp')
-rw-r--r--src/saveload/oldloader.cpp19
1 files changed, 13 insertions, 6 deletions
diff --git a/src/saveload/oldloader.cpp b/src/saveload/oldloader.cpp
index b0688ed7a..65e881869 100644
--- a/src/saveload/oldloader.cpp
+++ b/src/saveload/oldloader.cpp
@@ -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(LoadgameState *ls)
/* 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 *base, const OldChunks *chunks)
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 *base, const OldChunks *chunks)
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 *ls)
{
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;