ef_verify: Fix test for undumpable tables

Virtual selectors can't be used in xundump, since we lack a setter to
go with ca_get().  verify_ca() verifies they don't occur in tables
that can be xundumped.

When I restricted xundump to tables with a file name (commit 029d929,
v4.3.28), I neglected to update the test in verify_ca().

Factor out the correct test into xundumpable().  Use it to fix
verify_ca().

Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
This commit is contained in:
Markus Armbruster 2016-06-26 06:33:36 +02:00
parent bb0f3a656e
commit 18b5d16248
3 changed files with 16 additions and 6 deletions

View file

@ -27,7 +27,7 @@
* xdump.h: Extended dumps * xdump.h: Extended dumps
* *
* Known contributors to this file: * Known contributors to this file:
* Markus Armbruster, 2008-2014 * Markus Armbruster, 2008-2016
*/ */
#ifndef XDUMP_H #ifndef XDUMP_H
@ -54,6 +54,7 @@ extern void xdcolhdr(struct xdstr *, struct castr[]);
extern void xdflds(struct xdstr *, struct castr[], void *); extern void xdflds(struct xdstr *, struct castr[], void *);
extern void xdftr(struct xdstr *, int); extern void xdftr(struct xdstr *, int);
extern int xundump(FILE *, char *, int *, int); extern int xundump(FILE *, char *, int *, int);
extern int xundumpable(int);
extern int xundump_redundant(int, int, void *); extern int xundump_redundant(int, int, void *);
#endif #endif

View file

@ -40,6 +40,7 @@
#include "misc.h" #include "misc.h"
#include "nsc.h" #include "nsc.h"
#include "product.h" #include "product.h"
#include "xdump.h"
static void verify_fail(int, int, struct castr *, int, char *, ...) static void verify_fail(int, int, struct castr *, int, char *, ...)
ATTRIBUTE((format (printf, 5, 6))); ATTRIBUTE((format (printf, 5, 6)));
@ -74,10 +75,9 @@ verify_ca(int type)
for (i = 0; ca[i].ca_name; i++) { for (i = 0; ca[i].ca_name; i++) {
/* /*
* Virtual selectors can't be used in xundump, since we lack a * Virtual selectors can't be used in xundump, since we lack a
* setter to go with ca_get(). Exception: if EFF_MEM is not * setter to go with ca_get().
* set, xundump doesn't touch the table.
*/ */
if (CANT_HAPPEN((ef_flags(type) & EFF_MEM) if (CANT_HAPPEN(xundumpable(type)
&& ca[i].ca_get && ca[i].ca_get
&& ca[i].ca_dump <= CA_DUMP_CONST)) && ca[i].ca_dump <= CA_DUMP_CONST))
ca[i].ca_dump = CA_DUMP_ONLY; ca[i].ca_dump = CA_DUMP_ONLY;

View file

@ -1155,8 +1155,7 @@ xuheader(FILE *fp, int expected_table)
return gripe("expected table '%s', not '%s'", return gripe("expected table '%s', not '%s'",
ef_nameof(expected_table), name); ef_nameof(expected_table), name);
if (!empfile[type].file if (!xundumpable(type)) {
|| !ef_cadef(type) || !(ef_flags(type) & EFF_MEM)) {
CANT_HAPPEN(expected_table != EF_BAD); CANT_HAPPEN(expected_table != EF_BAD);
return gripe("table '%s' is not permitted here", name); return gripe("table '%s' is not permitted here", name);
} }
@ -1168,6 +1167,16 @@ xuheader(FILE *fp, int expected_table)
return type; 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. * Find fields in this xdump.
* If reading human-readable syntax, read a field header line from @fp. * If reading human-readable syntax, read a field header line from @fp.