summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_linker.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/kern_linker.c')
-rw-r--r--sys/kern/kern_linker.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c
index 43ccd74..e4837d1 100644
--- a/sys/kern/kern_linker.c
+++ b/sys/kern/kern_linker.c
@@ -1584,6 +1584,12 @@ restart:
modname = mp->md_cval;
verinfo = mp->md_data;
mod = modlist_lookup2(modname, verinfo);
+ if (mod == NULL) {
+ printf("KLD file %s - cannot find "
+ "dependency \"%s\"\n",
+ lf->filename, modname);
+ goto fail;
+ }
/* Don't count self-dependencies */
if (lf == mod->container)
continue;
@@ -1600,11 +1606,9 @@ restart:
*/
error = LINKER_LINK_PRELOAD_FINISH(lf);
if (error) {
- TAILQ_REMOVE(&depended_files, lf, loaded);
printf("KLD file %s - could not finalize loading\n",
lf->filename);
- linker_file_unload(lf, LINKER_UNLOAD_FORCE);
- continue;
+ goto fail;
}
linker_file_register_modules(lf);
if (linker_file_lookup_set(lf, "sysinit_set", &si_start,
@@ -1612,6 +1616,10 @@ restart:
sysinit_add(si_start, si_stop);
linker_file_register_sysctls(lf);
lf->flags |= LINKER_FILE_LINKED;
+ continue;
+fail:
+ TAILQ_REMOVE(&depended_files, lf, loaded);
+ linker_file_unload(lf, LINKER_UNLOAD_FORCE);
}
/* woohoo! we made it! */
}
@@ -2137,5 +2145,5 @@ sysctl_kern_function_list(SYSCTL_HANDLER_ARGS)
return (SYSCTL_OUT(req, "", 1));
}
-SYSCTL_PROC(_kern, OID_AUTO, function_list, CTLFLAG_RD,
+SYSCTL_PROC(_kern, OID_AUTO, function_list, CTLTYPE_OPAQUE | CTLFLAG_RD,
NULL, 0, sysctl_kern_function_list, "", "kernel function list");
OpenPOWER on IntegriCloud