diff options
author | jhb <jhb@FreeBSD.org> | 2002-06-07 05:41:27 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2002-06-07 05:41:27 +0000 |
commit | eb29fde68b289c16b9ea94acea2342fc6d6042d7 (patch) | |
tree | 6661e3dca12190987133994438ecc89badab8f0d /sys/kern | |
parent | e277387a704340cabd0a8f106eee363613966b38 (diff) | |
download | FreeBSD-src-eb29fde68b289c16b9ea94acea2342fc6d6042d7.zip FreeBSD-src-eb29fde68b289c16b9ea94acea2342fc6d6042d7.tar.gz |
Properly lock accesses to p_tracep and p_traceflag. Also make a few
ktrace-only things #ifdef KTRACE that were not before.
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_exec.c | 11 | ||||
-rw-r--r-- | sys/kern/kern_exit.c | 5 | ||||
-rw-r--r-- | sys/kern/kern_proc.c | 14 |
3 files changed, 27 insertions, 3 deletions
diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c index f3a24c8..913f951 100644 --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -135,7 +135,10 @@ execve(td, uap) int (*img_first)(struct image_params *); struct pargs *oldargs, *newargs = NULL; struct procsig *oldprocsig, *newprocsig; - struct vnode *tracevp = NULL, *textvp = NULL; +#ifdef KTRACE + struct vnode *tracevp = NULL; +#endif + struct vnode *textvp = NULL; imgp = &image_params; @@ -369,11 +372,15 @@ interpret: * we do not regain any tracing during a possible block. */ setsugid(p); +#ifdef KTRACE if (p->p_tracep && suser_cred(oldcred, PRISON_ROOT)) { + mtx_lock(&ktrace_mtx); p->p_traceflag = 0; tracevp = p->p_tracep; p->p_tracep = NULL; + mtx_unlock(&ktrace_mtx); } +#endif /* Make sure file descriptors 0..2 are in use. */ error = fdcheckstd(td); if (error != 0) @@ -475,8 +482,10 @@ interpret: */ if (textvp != NULL) vrele(textvp); +#ifdef KTRACE if (tracevp != NULL) vrele(tracevp); +#endif pargs_drop(oldargs); exec_fail_dealloc: diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index d44209a..d35b3e1 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -64,6 +64,9 @@ #include <sys/shm.h> #include <sys/sem.h> #include <sys/jail.h> +#ifdef KTRACE +#include <sys/ktrace.h> +#endif #include <vm/vm.h> #include <vm/vm_extern.h> @@ -296,9 +299,11 @@ exit1(td, rv) * release trace file */ PROC_LOCK(p); + mtx_lock(&ktrace_mtx); p->p_traceflag = 0; /* don't trace the vrele() */ tracevp = p->p_tracep; p->p_tracep = NULL; + mtx_unlock(&ktrace_mtx); PROC_UNLOCK(p); if (tracevp != NULL) vrele(tracevp); diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index ebef4a6..1f48fa8 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -34,6 +34,8 @@ * $FreeBSD$ */ +#include "opt_ktrace.h" + #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> @@ -49,6 +51,10 @@ #include <sys/sx.h> #include <sys/user.h> #include <sys/jail.h> +#ifdef KTRACE +#include <sys/uio.h> +#include <sys/ktrace.h> +#endif #include <vm/vm.h> #include <vm/pmap.h> @@ -643,8 +649,13 @@ fill_kinfo_proc(p, kp) PROC_LOCK_ASSERT(p, MA_OWNED); kp->ki_addr =/* p->p_addr; */0; /* XXXKSE */ kp->ki_args = p->p_args; - kp->ki_tracep = p->p_tracep; kp->ki_textvp = p->p_textvp; +#ifdef KTRACE + kp->ki_tracep = p->p_tracep; + mtx_lock(&ktrace_mtx); + kp->ki_traceflag = p->p_traceflag; + mtx_unlock(&ktrace_mtx); +#endif kp->ki_fd = p->p_fd; kp->ki_vmspace = p->p_vmspace; if (p->p_ucred) { @@ -696,7 +707,6 @@ fill_kinfo_proc(p, kp) kp->ki_stat = p->p_stat; kp->ki_sflag = p->p_sflag; kp->ki_swtime = p->p_swtime; - kp->ki_traceflag = p->p_traceflag; kp->ki_pid = p->p_pid; /* vvv XXXKSE */ bintime2timeval(&p->p_runtime, &tv); |