summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2002-06-07 05:41:27 +0000
committerjhb <jhb@FreeBSD.org>2002-06-07 05:41:27 +0000
commiteb29fde68b289c16b9ea94acea2342fc6d6042d7 (patch)
tree6661e3dca12190987133994438ecc89badab8f0d /sys/kern
parente277387a704340cabd0a8f106eee363613966b38 (diff)
downloadFreeBSD-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.c11
-rw-r--r--sys/kern/kern_exit.c5
-rw-r--r--sys/kern/kern_proc.c14
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);
OpenPOWER on IntegriCloud