diff --git a/include/xdump.h b/include/xdump.h index cae34af7..da3d3780 100644 --- a/include/xdump.h +++ b/include/xdump.h @@ -27,7 +27,7 @@ * xdump.h: Extended dumps * * Known contributors to this file: - * Markus Armbruster, 2008-2014 + * Markus Armbruster, 2008-2016 */ #ifndef XDUMP_H @@ -54,6 +54,7 @@ extern void xdcolhdr(struct xdstr *, struct castr[]); extern void xdflds(struct xdstr *, struct castr[], void *); extern void xdftr(struct xdstr *, int); extern int xundump(FILE *, char *, int *, int); +extern int xundumpable(int); extern int xundump_redundant(int, int, void *); #endif diff --git a/src/lib/common/ef_verify.c b/src/lib/common/ef_verify.c index c96d7b0f..041a92f0 100644 --- a/src/lib/common/ef_verify.c +++ b/src/lib/common/ef_verify.c @@ -40,6 +40,7 @@ #include "misc.h" #include "nsc.h" #include "product.h" +#include "xdump.h" static void verify_fail(int, int, struct castr *, int, char *, ...) ATTRIBUTE((format (printf, 5, 6))); @@ -74,10 +75,9 @@ verify_ca(int type) for (i = 0; ca[i].ca_name; i++) { /* * Virtual selectors can't be used in xundump, since we lack a - * setter to go with ca_get(). Exception: if EFF_MEM is not - * set, xundump doesn't touch the table. + * setter to go with ca_get(). */ - if (CANT_HAPPEN((ef_flags(type) & EFF_MEM) + if (CANT_HAPPEN(xundumpable(type) && ca[i].ca_get && ca[i].ca_dump <= CA_DUMP_CONST)) ca[i].ca_dump = CA_DUMP_ONLY; diff --git a/src/lib/common/xundump.c b/src/lib/common/xundump.c index 590fdfe9..b7f8df04 100644 --- a/src/lib/common/xundump.c +++ b/src/lib/common/xundump.c @@ -1155,8 +1155,7 @@ xuheader(FILE *fp, int expected_table) return gripe("expected table '%s', not '%s'", ef_nameof(expected_table), name); - if (!empfile[type].file - || !ef_cadef(type) || !(ef_flags(type) & EFF_MEM)) { + if (!xundumpable(type)) { CANT_HAPPEN(expected_table != EF_BAD); return gripe("table '%s' is not permitted here", name); } @@ -1168,6 +1167,16 @@ xuheader(FILE *fp, int expected_table) return type; } +/* + * Can table @type be xundumped? + */ +int +xundumpable(int type) +{ + return empfile[type].file && ef_cadef(type) + && (ef_flags(type) & EFF_MEM); +} + /* * Find fields in this xdump. * If reading human-readable syntax, read a field header line from @fp.