From 238b9afc3bfe3e5a335c1898ee21200c14d6e679 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Mon, 12 May 2008 12:39:38 +0200 Subject: [PATCH] Catch selectors that make xundump oops early Oops in new verify_ca(), which runs during initialization. --- src/lib/common/ef_verify.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/lib/common/ef_verify.c b/src/lib/common/ef_verify.c index 62c5cab2..dc3c2e4c 100644 --- a/src/lib/common/ef_verify.c +++ b/src/lib/common/ef_verify.c @@ -70,6 +70,25 @@ verify_fail(int type, int row, struct castr *ca, int idx, char *fmt, ...) putc('\n', stderr); } +static int +verify_ca(int type) +{ + struct castr *ca = ef_cadef(type); + int i; + + for (i = 0; ca[i].ca_name; i++) { + /* + * Virtual selectors must be NSC_EXTRA, because xundump can't + * cope with them without setter methods. Exception: if + * EFF_MEM is not set, xundump doesn't touch the table. + */ + if (CANT_HAPPEN((ef_flags(type) & EFF_MEM) + && ca[i].ca_get && !(ca[i].ca_flags & NSC_EXTRA))) + ca[i].ca_flags |= NSC_EXTRA; + } + return 0; +} + static int verify_row(int type, int row) { @@ -199,6 +218,7 @@ ef_verify() for (ep = empfile; ep->name; ep++) { if (!ef_cadef(ep->uid)) continue; + verify_ca(ep->uid); for (i = 0; i < ef_nelem(ep->uid); i++) { retval += verify_row(ep->uid, i); }