diff options
author | jhb <jhb@FreeBSD.org> | 2007-06-13 19:41:47 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2007-06-13 19:41:47 +0000 |
commit | 1c98f58fd259212d95e6e56051d12f66eddeb9e0 (patch) | |
tree | 0cd77da3be03b12ae6f3610486e39ed08d0eeadf | |
parent | 25f7638e33b12c071b8863844f4663822f5bfabc (diff) | |
download | FreeBSD-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
-rw-r--r-- | sys/kern/kern_exec.c | 7 |
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 |