Validating sanity of locations in restored game
authorNHOrus <jy6x2b32pie9@yahoo.com>
Sun, 13 Aug 2017 11:41:42 +0000 (12:41 +0100)
committerNHOrus <jy6x2b32pie9@yahoo.com>
Sun, 13 Aug 2017 14:13:20 +0000 (15:13 +0100)
saveresume.c

index d8541748fbf25fe573770562028838c65248ac7a..889794596ae2325e8500e909e7765f9f567b0a32 100644 (file)
@@ -105,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
@@ -118,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 {
-       game = save.game;
+    } 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