Merge pull request #1110 from ggrtk/limit-save-state-version

System: Limit maximum loadable save state version
This commit is contained in:
Connor McLaughlin 2020-11-28 00:12:12 +10:00 committed by GitHub
commit 05124fa635
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 11 additions and 7 deletions

View file

@ -5,6 +5,8 @@ static constexpr u32 SAVE_STATE_MAGIC = 0x43435544;
static constexpr u32 SAVE_STATE_VERSION = 45;
static constexpr u32 SAVE_STATE_MINIMUM_VERSION = 42;
static_assert(SAVE_STATE_VERSION >= SAVE_STATE_MINIMUM_VERSION);
#pragma pack(push, 4)
struct SAVE_STATE_HEADER
{

View file

@ -951,12 +951,13 @@ bool DoLoadState(ByteStream* state, bool force_software_renderer, bool update_di
if (header.magic != SAVE_STATE_MAGIC)
return false;
if (header.version < SAVE_STATE_MINIMUM_VERSION)
if (header.version < SAVE_STATE_MINIMUM_VERSION || header.version > SAVE_STATE_VERSION)
{
g_host_interface->ReportFormattedError(
g_host_interface->TranslateString("System",
"Save state is incompatible: minimum version is %u but state is version %u."),
SAVE_STATE_MINIMUM_VERSION, header.version);
"Save state is incompatible: %s version is %u but state is version %u."),
header.version > SAVE_STATE_VERSION ? "maximum" : "minimum",
header.version > SAVE_STATE_VERSION ? SAVE_STATE_VERSION : SAVE_STATE_MINIMUM_VERSION, header.version);
return false;
}

View file

@ -1986,11 +1986,12 @@ CommonHostInterface::GetExtendedSaveStateInfo(const char* game_code, s32 slot)
ssi.slot = slot;
ssi.global = global;
if (header.version < SAVE_STATE_MINIMUM_VERSION)
if (header.version < SAVE_STATE_MINIMUM_VERSION || header.version > SAVE_STATE_VERSION)
{
ssi.title =
StringUtil::StdStringFromFormat(TranslateString("CommonHostInterface", "Invalid version %u (minimum version %u)"),
header.version, SAVE_STATE_MINIMUM_VERSION);
ssi.title = StringUtil::StdStringFromFormat(
TranslateString("CommonHostInterface", "Invalid version %u (%s version %u)"), header.version,
header.version > SAVE_STATE_VERSION ? "maximum" : "minimum",
header.version > SAVE_STATE_VERSION ? SAVE_STATE_VERSION : SAVE_STATE_MINIMUM_VERSION);
return ssi;
}