Verify bounds for linked lists
[open-adventure.git] / saveresume.c
index 8a33c3e992fa8e217825c17f3a5cf9fa54e32fec..4378324c3b3fd5bf00437587727563c4f953e496 100644 (file)
@@ -185,8 +185,8 @@ bool is_valid(struct game_t valgame)
     }
 
     /* Check that properties of objects aren't beyond expected */
-    for (int obj = 0; obj <= NOBJECTS; obj++) {
-        if (game.prop[obj] < STATE_NOTFOUND || game.prop[obj] > 1) {
+    for (obj_t obj = 0; obj <= NOBJECTS; obj++) {
+        if (valgame.prop[obj] < STATE_NOTFOUND || valgame.prop[obj] > 1) {
             switch (obj) {
             case RUG:
             case DRAGON:
@@ -199,18 +199,29 @@ bool is_valid(struct game_t valgame)
             case EGGS:
             case VASE:
             case CHAIN:
-                if (game.prop[obj] == 2) // There are multiple different states, but it's convenient to clump them together
+                if (valgame.prop[obj] == 2) // There are multiple different states, but it's convenient to clump them together
                     continue;
             case BEAR:
-                if (game.prop[BEAR] == CONTENTED_BEAR || game.prop[BEAR] == BEAR_DEAD)
+                if (valgame.prop[BEAR] == CONTENTED_BEAR || game.prop[BEAR] == BEAR_DEAD)
                     continue;
             default:
-                printf("%i", obj);
                 return false;
             }
         }
     }
 
+    /* Check that values in linked lists for objects in locations are inside bounds */
+    for (loc_t loc = LOC_NOWHERE; loc <= NLOCATIONS; loc++) {
+        if (valgame.atloc[loc] < NO_OBJECT || valgame.atloc[loc] > NOBJECTS * 2) {
+            return false;
+        }
+    }
+    for (obj_t obj = 0; obj <= NOBJECTS * 2; obj++ ) {
+        if (valgame.link[obj] < NO_OBJECT || valgame.link[obj] > NOBJECTS * 2) {
+            return false;
+        }
+    }
+
     return true;
 }