1
0
Fork 0

Fix fbd71a9: for TTO savegames, getting the savegame type left the file pointing to the wrong location

pull/11795/head
Rubidium 2024-01-15 20:58:24 +01:00 committed by rubidium42
parent d5518f6263
commit f99793547e
1 changed files with 7 additions and 4 deletions

View File

@ -225,16 +225,17 @@ static bool VerifyOldNameChecksum(char *title, uint len)
static std::tuple<SavegameType, std::string> 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;