summaryrefslogtreecommitdiffstats
path: root/sys/kern/sys_process.c
diff options
context:
space:
mode:
authordavidxu <davidxu@FreeBSD.org>2005-11-08 23:28:12 +0000
committerdavidxu <davidxu@FreeBSD.org>2005-11-08 23:28:12 +0000
commite4f3a40860ca49e8859564345e25e470360e3235 (patch)
tree589fc6e6ad861ab0172bddb7bf401960ea3991dc /sys/kern/sys_process.c
parent066b259890e4fbc852c3f553652301b443fca6b5 (diff)
downloadFreeBSD-src-e4f3a40860ca49e8859564345e25e470360e3235.zip
FreeBSD-src-e4f3a40860ca49e8859564345e25e470360e3235.tar.gz
Make sure pending SIGCHLD is removed from previous parent when process
is attached or detached.
Diffstat (limited to 'sys/kern/sys_process.c')
-rw-r--r--sys/kern/sys_process.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c
index f1157ca..0176525 100644
--- a/sys/kern/sys_process.c
+++ b/sys/kern/sys_process.c
@@ -673,8 +673,12 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data)
/* security check done above */
p->p_flag |= P_TRACED;
p->p_oppid = p->p_pptr->p_pid;
- if (p->p_pptr != td->td_proc)
+ if (p->p_pptr != td->td_proc) {
+ PROC_LOCK(p->p_pptr);
+ sigqueue_take(p->p_ksi);
+ PROC_UNLOCK(p->p_pptr);
proc_reparent(p, td->td_proc);
+ }
data = SIGSTOP;
goto sendsig; /* in PT_CONTINUE below */
@@ -765,6 +769,10 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data)
if (p->p_oppid != p->p_pptr->p_pid) {
struct proc *pp;
+ PROC_LOCK(p->p_pptr);
+ sigqueue_take(p->p_ksi);
+ PROC_UNLOCK(p->p_pptr);
+
PROC_UNLOCK(p);
pp = pfind(p->p_oppid);
if (pp == NULL)
@@ -780,6 +788,7 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data)
p->p_oppid = 0;
/* should we send SIGCHLD? */
+ /* childproc_continued(p); */
}
sendsig:
OpenPOWER on IntegriCloud