From 46e12b42fed11fd1d8a44671ef98d462ea5e42b7 Mon Sep 17 00:00:00 2001 From: Alfred Perlstein Date: Sun, 14 Apr 2002 17:12:55 +0000 Subject: [PATCH] Don't allow one to trace an ancestor when already traced. PR: kern/29741 Submitted by: Dave Zarzycki Fix from: Tim J. Robbins MFC After: 2 weeks --- sys/kern/sys_process.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c index 42cdebcc8c8..3561f6ff465 100644 --- a/sys/kern/sys_process.c +++ b/sys/kern/sys_process.c @@ -332,11 +332,13 @@ ptrace(struct thread *td, struct ptrace_args *uap) struct fpreg fpreg; struct reg reg; } r; - struct proc *p; + struct proc *curp, *p, *pp; struct thread *td2; int error, write; int proctree_locked = 0; + curp = td->td_proc; + /* * Do copyin() early before getting locks and lock proctree before * locking the process. @@ -422,6 +424,17 @@ ptrace(struct thread *td, struct ptrace_args *uap) goto fail; } + /* Can't trace an ancestor if you're being traced. */ + if (curp->p_flag & P_TRACED) { + for (pp = curp->p_pptr; pp != NULL; pp = pp->p_pptr) { + if (pp == p) { + error = EINVAL; + goto fail; + } + } + } + + /* OK */ break;