summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_exec.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2007-06-13 19:41:47 +0000
committerjhb <jhb@FreeBSD.org>2007-06-13 19:41:47 +0000
commit1c98f58fd259212d95e6e56051d12f66eddeb9e0 (patch)
tree0cd77da3be03b12ae6f3610486e39ed08d0eeadf /sys/kern/kern_exec.c
parent25f7638e33b12c071b8863844f4663822f5bfabc (diff)
downloadFreeBSD-src-1c98f58fd259212d95e6e56051d12f66eddeb9e0.zip
FreeBSD-src-1c98f58fd259212d95e6e56051d12f66eddeb9e0.tar.gz
Conditionally acquire Giant when dropping a reference on the ktrace vnode
during execve() when turning off tracing due to executing a setuid binary as non-root. Previously this could fail to acquire Giant and fail an assertion if the ktrace file was on a non-MPSAFE filesystem and the executable was on an MPSAFE filesystem. MFC after: 3 days Reported by: kris
Diffstat (limited to 'sys/kern/kern_exec.c')
-rw-r--r--sys/kern/kern_exec.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c
index 0e1b696..42de9ed 100644
--- a/sys/kern/kern_exec.c
+++ b/sys/kern/kern_exec.c
@@ -736,8 +736,13 @@ done1:
if (ndp->ni_vp && error != 0)
vrele(ndp->ni_vp);
#ifdef KTRACE
- if (tracevp != NULL)
+ if (tracevp != NULL) {
+ int tvfslocked;
+
+ tvfslocked = VFS_LOCK_GIANT(tracevp->v_mount);
vrele(tracevp);
+ VFS_UNLOCK_GIANT(tvfslocked);
+ }
if (tracecred != NULL)
crfree(tracecred);
#endif
OpenPOWER on IntegriCloud