diff options
author | alfred <alfred@FreeBSD.org> | 2002-04-14 17:12:55 +0000 |
---|---|---|
committer | alfred <alfred@FreeBSD.org> | 2002-04-14 17:12:55 +0000 |
commit | 09258856910ae8a198a025ce342e7be621517c6b (patch) | |
tree | 86cf9a464fc95764601e09b652b83648c7a83ea5 | |
parent | 1fd1b83baf376aa6cdbc4fee6c646c2e732250cd (diff) | |
download | FreeBSD-src-09258856910ae8a198a025ce342e7be621517c6b.zip FreeBSD-src-09258856910ae8a198a025ce342e7be621517c6b.tar.gz |
Don't allow one to trace an ancestor when already traced.
PR: kern/29741
Submitted by: Dave Zarzycki <zarzycki@FreeBSD.org>
Fix from: Tim J. Robbins <tim@robbins.dropbear.id.au>
MFC After: 2 weeks
-rw-r--r-- | sys/kern/sys_process.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c index 42cdebc..3561f6f 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; |