]> git.pond.sub.org Git - empserver/blobdiff - src/lib/common/ef_verify.c
Fix empdump not to touch plane file when import fails
[empserver] / src / lib / common / ef_verify.c
index 1ddd89e097daa11eb1b0bed80a7f8d4a713b44ac..139d04315a9d411f117ac25c4d6f77e5bca45e47 100644 (file)
@@ -122,6 +122,13 @@ verify_tabref(int type, int row, struct castr *ca, int idx, long val)
                        val, ef_nameof(tabno), ef_nelem(tabno));
            return -1;
        }
+       /* laziness: assumes TABNO is EFF_MEM */
+       if (val >= 0 && !empobj_in_use(tabno, ef_ptr(tabno, val))) {
+           verify_fail(type, row, ca, idx,
+                       "value %ld refers to missing element of table %s",
+                       val, ef_nameof(tabno));
+           return -1;
+       }
     }
     return 0;
 }
@@ -187,7 +194,7 @@ verify_row(int type, int row)
 }
 
 static void
-pln_zap_transient_flags(void)
+pln_zap_transient_flags(int may_put)
 {
     int i;
     struct plnstr *pp;
@@ -209,12 +216,18 @@ pln_zap_transient_flags(void)
             */
        }
     }
-    if (dirty)
+    if (dirty && may_put)
        ef_flush(EF_PLANE);     /* pretty wasteful */
 }
 
+/*
+ * Verify game state and configuration are sane.
+ * Correct minor problems, but write corrections to backing files only
+ * if MAY_PUT is non-zero.
+ * Return -1 if uncorrected problems remain, else 0.
+ */
 int
-ef_verify(void)
+ef_verify(int may_put)
 {
     struct empfile *ep;
     int retval = 0;
@@ -241,6 +254,6 @@ ef_verify(void)
        }
     }
 
-    pln_zap_transient_flags();
+    pln_zap_transient_flags(may_put);
     return retval;
 }