From f99793547e4a7bfc61786ac3867639ed70c5bb3d Mon Sep 17 00:00:00 2001 From: Rubidium Date: Mon, 15 Jan 2024 20:58:24 +0100 Subject: [PATCH] Fix fbd71a9: for TTO savegames, getting the savegame type left the file pointing to the wrong location --- src/saveload/oldloader.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/saveload/oldloader.cpp b/src/saveload/oldloader.cpp index 76e6b4a119..4f1954cc11 100644 --- a/src/saveload/oldloader.cpp +++ b/src/saveload/oldloader.cpp @@ -225,16 +225,17 @@ static bool VerifyOldNameChecksum(char *title, uint len) static std::tuple DetermineOldSavegameTypeAndName(FILE *f) { + long pos = ftell(f); char buffer[std::max(TTO_HEADER_SIZE, TTD_HEADER_SIZE)]; - if (fread(buffer, 1, lengthof(buffer), f) != lengthof(buffer)) { + if (pos < 0 || fread(buffer, 1, lengthof(buffer), f) != lengthof(buffer)) { return { SGT_INVALID, "(broken) Unable to read file" }; } - if (VerifyOldNameChecksum(buffer, TTO_HEADER_SIZE)) { + if (VerifyOldNameChecksum(buffer, TTO_HEADER_SIZE) && fseek(f, pos + TTO_HEADER_SIZE, SEEK_SET) == 0) { return { SGT_TTO, "(TTO)" + StrMakeValid({buffer, TTO_HEADER_SIZE - HEADER_CHECKSUM_SIZE}) }; } - if (VerifyOldNameChecksum(buffer, TTD_HEADER_SIZE)) { + if (VerifyOldNameChecksum(buffer, TTD_HEADER_SIZE) && fseek(f, pos + TTD_HEADER_SIZE, SEEK_SET) == 0) { return { SGT_TTD, "(TTD)" + StrMakeValid({buffer, TTD_HEADER_SIZE - HEADER_CHECKSUM_SIZE}) }; } @@ -267,7 +268,9 @@ bool LoadOldSaveGame(const std::string &file) switch (type) { case SGT_TTO: proc = &LoadTTOMain; break; case SGT_TTD: proc = &LoadTTDMain; break; - default: break; + default: + Debug(oldloader, 0, "Unknown savegame type; cannot be loaded"); + break; } _savegame_type = type;