X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=saveresume.c;h=889794596ae2325e8500e909e7765f9f567b0a32;hb=36f72f190259b3ff72a87d1e888a578d6fd5b8da;hp=276667d1f2a661d21e56760b281c21d5f7f65711;hpb=73278b1a3c6535edba5076ab1750e609a76325f2;p=open-adventure.git diff --git a/saveresume.c b/saveresume.c index 276667d..8897945 100644 --- a/saveresume.c +++ b/saveresume.c @@ -36,7 +36,7 @@ int savefile(FILE *fp, long version) save.mode = -1; save.version = (version == 0) ? VRSION : version; - memcpy(&save.game, &game, sizeof(struct game_t)); + save.game = game; IGNORE(fwrite(&save, sizeof(struct save_t), 1, fp)); return (0); } @@ -85,7 +85,8 @@ int resume(void) #endif FILE *fp = NULL; - if (game.loc != 1 || game.abbrev[1] != 1) { + if (game.loc != 1 || + game.abbrev[1] != 1) { rspeak(RESUME_ABANDON); if (!yes(arbitrary_messages[THIS_ACCEPTABLE], arbitrary_messages[OK_MAN], arbitrary_messages[OK_MAN])) return GO_CLEAROBJ; @@ -104,6 +105,8 @@ int resume(void) return restore(fp); } +bool is_valid(struct game_t); + int restore(FILE* fp) { /* Read and restore game state from file, assuming @@ -117,10 +120,32 @@ int restore(FILE* fp) fclose(fp); if (save.version != VRSION) { rspeak(VERSION_SKEW, save.version / 10, MOD(save.version, 10), VRSION / 10, MOD(VRSION, 10)); - } else { - memcpy(&game, &save.game, sizeof(struct game_t)); + } else if (is_valid(save.game)) { + game = save.game; } return GO_TOP; } -/* end */ +bool is_valid(struct game_t valgame) +{ + /* Save files can be roughly grouped into three groups: + * With valid, reaceable state, with valid, but unreachable + * state and with invaild state. We check that state is + * valid: no states are outside minimal or maximal value + */ + + /* Bounds check for locations + */ + if ( valgame.chloc < -1 || valgame.chloc > NLOCATIONS || + valgame.chloc < -1 || valgame.chloc > NLOCATIONS || + valgame.loc < -1 || valgame.loc > NLOCATIONS || + valgame.newloc < -1 || valgame.newloc > NLOCATIONS || + valgame.oldloc < -1 || valgame.oldloc > NLOCATIONS || + valgame.oldloc < -1 || valgame.oldloc > NLOCATIONS) { + return false; + } + + return true; +} + +/* end */ \ No newline at end of file