From 75d9a5b7d61e042f1f1dcddd9c18875b8e3e970e Mon Sep 17 00:00:00 2001 From: hselasky Date: Thu, 5 Dec 2019 14:53:46 +0000 Subject: [PATCH] MFC r355108 and r355170: Fix panic when loading kernel modules before root file system is mounted. Make sure the rootvnode is always NULL checked. Differential Revision: https://reviews.freebsd.org/D22545 PR: 241639 Sponsored by: Mellanox Technologies git-svn-id: svn://svn.freebsd.org/base/stable/10@355419 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- sys/kern/kern_linker.c | 8 ++++++-- sys/kern/subr_firmware.c | 6 ------ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c index c52efc424..13eb1bf73 100644 --- a/sys/kern/kern_linker.c +++ b/sys/kern/kern_linker.c @@ -2000,14 +2000,18 @@ linker_load_module(const char *kldname, const char *modname, */ KASSERT(verinfo == NULL, ("linker_load_module: verinfo" " is not NULL")); + /* check if root file system is not mounted */ + if (rootvnode == NULL || curproc->p_fd->fd_rdir == NULL) + return (ENXIO); pathname = linker_search_kld(kldname); } else { if (modlist_lookup2(modname, verinfo) != NULL) return (EEXIST); + /* check if root file system is not mounted */ + if (rootvnode == NULL || curproc->p_fd->fd_rdir == NULL) + return (ENXIO); if (kldname != NULL) pathname = strdup(kldname, M_LINKER); - else if (rootvnode == NULL) - pathname = NULL; else /* * Need to find a KLD with required module diff --git a/sys/kern/subr_firmware.c b/sys/kern/subr_firmware.c index 20ab76e28..56924d654 100644 --- a/sys/kern/subr_firmware.c +++ b/sys/kern/subr_firmware.c @@ -255,7 +255,6 @@ firmware_unregister(const char *imagename) static void loadimage(void *arg, int npending) { - struct thread *td = curthread; char *imagename = arg; struct priv_fw *fp; linker_file_t result; @@ -265,11 +264,6 @@ loadimage(void *arg, int npending) mtx_lock(&firmware_mtx); mtx_unlock(&firmware_mtx); - if (td->td_proc->p_fd->fd_rdir == NULL) { - printf("%s: root not mounted yet, no way to load image\n", - imagename); - goto done; - } error = linker_reference_module(imagename, NULL, &result); if (error != 0) { printf("%s: could not load firmware image, error %d\n", -- 2.42.0