summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_linker.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2009-02-05 23:01:36 +0000
committerjhb <jhb@FreeBSD.org>2009-02-05 23:01:36 +0000
commitfa654c58a4bfb22536c5568a23dbe93dc8ecdbc0 (patch)
treeaafa81f8735c76c617e6ec31245cb1c3431a7879 /sys/kern/kern_linker.c
parentd9be247f478f90aa920ebd36fba35df7332439c6 (diff)
downloadFreeBSD-src-fa654c58a4bfb22536c5568a23dbe93dc8ecdbc0.zip
FreeBSD-src-fa654c58a4bfb22536c5568a23dbe93dc8ecdbc0.tar.gz
Drop the kernel linker lock while running SYSUNINIT routines and removing
sysctls during a linker file unload. We drop the lock when doing similar operations during a linker file load. To close races, clear the LINKED flag before dropping the lock so that the linker file is no longer visible to userland. MFC after: 1 week
Diffstat (limited to 'sys/kern/kern_linker.c')
-rw-r--r--sys/kern/kern_linker.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c
index 1683a5a..c5e3a4e 100644
--- a/sys/kern/kern_linker.c
+++ b/sys/kern/kern_linker.c
@@ -643,8 +643,11 @@ linker_file_unload(linker_file_t file, int flags)
* link error.
*/
if (file->flags & LINKER_FILE_LINKED) {
+ file->flags &= ~LINKER_FILE_LINKED;
+ KLD_UNLOCK();
linker_file_sysuninit(file);
linker_file_unregister_sysctls(file);
+ KLD_LOCK();
}
TAILQ_REMOVE(&linker_files, file, link);
OpenPOWER on IntegriCloud