diff options
author | Zhenlei Huang <zlei@FreeBSD.org> | 2024-03-26 03:55:45 +0000 |
---|---|---|
committer | Zhenlei Huang <zlei@FreeBSD.org> | 2024-03-26 03:55:45 +0000 |
commit | f43ff3e15c8b4b161ce09c8ab008abc4222db26b (patch) | |
tree | c986bcb72459272dfed4e77c12dd6d8b4f874870 /sys/kern/kern_linker.c | |
parent | e0c92dd2b7e62e4f8281c9ad1d31465bb32f9e3b (diff) | |
download | src-f43ff3e15c8b4b161ce09c8ab008abc4222db26b.tar.gz src-f43ff3e15c8b4b161ce09c8ab008abc4222db26b.zip |
kern linker: Do not unload a module if it has dependants
Despite the name, linker_file_unload() will drop a reference and return
success when the module file has dependants, i.e. it has more than one
reference. When user request to unload such modules then the kernel
should reject unambiguously and immediately.
PR: 274986
Reviewed by: dfr, dab, jhb
MFC after: 2 weeks
Differential Revision: https://reviews.freebsd.org/D42527
Diffstat (limited to 'sys/kern/kern_linker.c')
-rw-r--r-- | sys/kern/kern_linker.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c index 1126bf967966..325dffbfedee 100644 --- a/sys/kern/kern_linker.c +++ b/sys/kern/kern_linker.c @@ -1280,6 +1280,8 @@ kern_kldunload(struct thread *td, int fileid, int flags) printf("kldunload: attempt to unload file that was" " loaded by the kernel\n"); error = EBUSY; + } else if (lf->refs > 1) { + error = EBUSY; } else { lf->userrefs--; error = linker_file_unload(lf, flags); |