]> git.pond.sub.org Git - empserver/commitdiff
Make ef_verify() check ef_type and uid
authorMarkus Armbruster <armbru@pond.sub.org>
Mon, 25 Feb 2008 20:07:06 +0000 (21:07 +0100)
committerMarkus Armbruster <armbru@pond.sub.org>
Fri, 14 Mar 2008 19:25:09 +0000 (20:25 +0100)
src/lib/common/ef_verify.c

index 255fc2ada571aef3333084014eddf1b2eb4072b8..c8e699dba30a26a2ede3146a188601a98352f690 100644 (file)
@@ -53,11 +53,14 @@ verify_fail(int type, int row, struct castr *ca, int idx, char *fmt, ...)
     /* Find base table of view, if any */
     for (i = 0; empfile[i].cache == empfile[type].cache; i++) ;
 
-    fprintf(stderr, "%s %s uid %d field %s",
+    fprintf(stderr, "%s %s uid %d",
            EF_IS_GAME_STATE(i) ? "File" : "Config",
-           ef_nameof(type), row, ca->ca_name);
-    if (ca->ca_type != NSC_STRINGY && ca->ca_len != 0)
-       fprintf(stderr, "(%d)", idx);
+           ef_nameof(type), row);
+    if (ca) {
+       fprintf(stderr, " field %s", ca->ca_name);
+       if (ca->ca_type != NSC_STRINGY && ca->ca_len != 0)
+           fprintf(stderr, "(%d)", idx);
+    }
     fprintf(stderr, ": ");
     va_start(ap, fmt);
     vfprintf(stderr, fmt, ap);
@@ -69,20 +72,27 @@ static int
 verify_row(int type, int row)
 {
     struct castr *ca = ef_cadef(type);
-    void *row_ref;
+    struct emptypedstr *row_ref;
     int i, j, k, n;
     struct castr *ca_sym;
     struct valstr val;
-    int ret_val = 0; 
-    int in_mem = (ef_flags(type) & EFF_MEM) != 0; 
+    int ret_val = 0;
+    int flags = ef_flags(type);
  
-    if (in_mem)
+    if (flags & EFF_MEM)
        row_ref = ef_ptr(type, row); 
     else {
        row_ref = malloc(empfile[type].size); 
        ef_read(type, row, row_ref);
     }
 
+    if ((flags & EFF_TYPED) && !EF_IS_VIEW(type)) {
+       if (row_ref->ef_type != type || row_ref->uid != row) {
+           verify_fail(type, row, NULL, 0, "header corrupt");
+           ret_val = -1;
+       }
+    }
+
     for (i = 0; ca[i].ca_name; ++i) {
        if (ca[i].ca_flags & NSC_EXTRA)
            continue;
@@ -152,7 +162,7 @@ verify_row(int type, int row)
            }
        } while (++j < n);
     } 
-    if (!in_mem)
+    if (!(flags & EFF_MEM))
         free(row_ref);
     return ret_val;
 }