diff options
author | markj <markj@FreeBSD.org> | 2016-08-22 17:23:27 +0000 |
---|---|---|
committer | markj <markj@FreeBSD.org> | 2016-08-22 17:23:27 +0000 |
commit | 55525d64d63bd8233dc487b5e2999236a2c71ee9 (patch) | |
tree | 38ead7c50209375fb526aed550d513b5d3f66b1c | |
parent | cdf85d32a58159745afdcc1de99a47f3521c6f13 (diff) | |
download | FreeBSD-src-55525d64d63bd8233dc487b5e2999236a2c71ee9.zip FreeBSD-src-55525d64d63bd8233dc487b5e2999236a2c71ee9.tar.gz |
MFC r304440, r304487:
Fix some handling of P2_PTRACE_FSTP.
-rw-r--r-- | sys/kern/kern_fork.c | 2 | ||||
-rw-r--r-- | sys/kern/kern_sig.c | 2 | ||||
-rw-r--r-- | sys/kern/sys_process.c | 9 | ||||
-rw-r--r-- | sys/sys/proc.h | 2 |
4 files changed, 8 insertions, 7 deletions
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index 0f7dd2e..b9e41af 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -1075,7 +1075,7 @@ fork_return(struct thread *td, struct trapframe *frame) * parent's children, do it now. */ dbg = p->p_pptr->p_pptr; - proc_set_traced(p); + proc_set_traced(p, true); CTR2(KTR_PTRACE, "fork_return: attaching to new child pid %d: oppid %d", p->p_pid, p->p_oppid); diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index 7af14a0..5a1b05e 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -2537,7 +2537,7 @@ ptracestop(struct thread *td, int sig) * a chance to report itself upon the next iteration. */ if ((td->td_dbgflags & TDB_FSTP) != 0 || - ((p->p_flag & P2_PTRACE_FSTP) == 0 && + ((p->p_flag2 & P2_PTRACE_FSTP) == 0 && p->p_xthread == NULL)) { p->p_xsig = sig; p->p_xthread = td; diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c index 7d2fd72..69a3e4b 100644 --- a/sys/kern/sys_process.c +++ b/sys/kern/sys_process.c @@ -693,12 +693,13 @@ sys_ptrace(struct thread *td, struct ptrace_args *uap) #endif void -proc_set_traced(struct proc *p) +proc_set_traced(struct proc *p, bool stop) { PROC_LOCK_ASSERT(p, MA_OWNED); p->p_flag |= P_TRACED; - p->p_flag2 |= P2_PTRACE_FSTP; + if (stop) + p->p_flag2 |= P2_PTRACE_FSTP; p->p_ptevents = PTRACE_DEFAULT; p->p_oppid = p->p_pptr->p_pid; } @@ -910,7 +911,7 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) switch (req) { case PT_TRACE_ME: /* set my trace flag and "owner" so it can read/write me */ - proc_set_traced(p); + proc_set_traced(p, false); if (p->p_flag & P_PPWAIT) p->p_flag |= P_PPTRACE; CTR1(KTR_PTRACE, "PT_TRACE_ME: pid %d", p->p_pid); @@ -927,7 +928,7 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) * The old parent is remembered so we can put things back * on a "detach". */ - proc_set_traced(p); + proc_set_traced(p, true); if (p->p_pptr != td->td_proc) { proc_reparent(p, td->td_proc); } diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 6ab638b..153b9f9 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -1005,7 +1005,7 @@ void proc_linkup(struct proc *p, struct thread *td); struct proc *proc_realparent(struct proc *child); void proc_reap(struct thread *td, struct proc *p, int *status, int options); void proc_reparent(struct proc *child, struct proc *newparent); -void proc_set_traced(struct proc *p); +void proc_set_traced(struct proc *p, bool stop); struct pstats *pstats_alloc(void); void pstats_fork(struct pstats *src, struct pstats *dst); void pstats_free(struct pstats *ps); |