diff options
| author | John Baldwin <jhb@FreeBSD.org> | 2006-06-20 21:31:38 +0000 |
|---|---|---|
| committer | John Baldwin <jhb@FreeBSD.org> | 2006-06-20 21:31:38 +0000 |
| commit | 62d615d50844083e4b9cc1406ee92afa4e84aef3 (patch) | |
| tree | ff143f7dfd89e19ee50e276b610ffb2807cc1964 /sys/kern/link_elf.c | |
| parent | 690d79381af2aaa73d538b5d7c65da77a4996287 (diff) | |
Notes
Diffstat (limited to 'sys/kern/link_elf.c')
| -rw-r--r-- | sys/kern/link_elf.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c index 7b3f1abc1b08..14b9c2e7ffab 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; } |
