summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/kern/sys_process.c15
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;
OpenPOWER on IntegriCloud