summaryrefslogtreecommitdiffstats
path: root/sys/kern/link_elf.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2006-06-20 21:31:38 +0000
committerjhb <jhb@FreeBSD.org>2006-06-20 21:31:38 +0000
commit3f7e224385f1737d75c25b508d028a5e861a7990 (patch)
treeff143f7dfd89e19ee50e276b610ffb2807cc1964 /sys/kern/link_elf.c
parent079c3bb7eb89d208baf9213e898444aaf349be2c (diff)
downloadFreeBSD-src-3f7e224385f1737d75c25b508d028a5e861a7990.zip
FreeBSD-src-3f7e224385f1737d75c25b508d028a5e861a7990.tar.gz
Conditionally acquire Giant around VFS operations.
Diffstat (limited to 'sys/kern/link_elf.c')
-rw-r--r--sys/kern/link_elf.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c
index 7b3f1ab..14b9c2e 100644
--- a/sys/kern/link_elf.c
+++ b/sys/kern/link_elf.c
@@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$");
#include <sys/mac.h>
#include <sys/malloc.h>
#include <sys/mutex.h>
+#include <sys/mount.h>
#include <sys/proc.h>
#include <sys/namei.h>
#include <sys/fcntl.h>
@@ -556,17 +557,19 @@ link_elf_load_file(linker_class_t cls, const char* filename,
int symstrindex;
int symcnt;
int strcnt;
+ int vfslocked;
GIANT_REQUIRED;
shdr = NULL;
lf = NULL;
- NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, filename, td);
+ NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, filename, td);
flags = FREAD;
error = vn_open(&nd, &flags, 0, -1);
if (error)
return error;
+ vfslocked = NDHASGIANT(&nd);
NDFREE(&nd, NDF_ONLY_PNBUF);
#ifdef MAC
error = mac_check_kld_load(curthread->td_ucred, nd.ni_vp);
@@ -859,6 +862,7 @@ out:
free(firstpage, M_LINKER);
VOP_UNLOCK(nd.ni_vp, 0, td);
vn_close(nd.ni_vp, FREAD, td->td_ucred, td);
+ VFS_UNLOCK_GIANT(vfslocked);
return error;
}
OpenPOWER on IntegriCloud