diff options
Diffstat (limited to 'sys/kern/kern_linker.c')
-rw-r--r-- | sys/kern/kern_linker.c | 16 |
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"); |