Catch selectors that make xundump oops early

Oops in new verify_ca(), which runs during initialization.
This commit is contained in:
Markus Armbruster 2008-05-12 12:39:38 +02:00
parent a38625d9a4
commit 238b9afc3b

View file

@ -70,6 +70,25 @@ verify_fail(int type, int row, struct castr *ca, int idx, char *fmt, ...)
putc('\n', stderr); 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 static int
verify_row(int type, int row) verify_row(int type, int row)
{ {
@ -199,6 +218,7 @@ ef_verify()
for (ep = empfile; ep->name; ep++) { for (ep = empfile; ep->name; ep++) {
if (!ef_cadef(ep->uid)) if (!ef_cadef(ep->uid))
continue; continue;
verify_ca(ep->uid);
for (i = 0; i < ef_nelem(ep->uid); i++) { for (i = 0; i < ef_nelem(ep->uid); i++) {
retval += verify_row(ep->uid, i); retval += verify_row(ep->uid, i);
} }