From ff7668079fdacf89d093376f9dbfa9c9b1a6f912 Mon Sep 17 00:00:00 2001 From: David Xu Date: Wed, 25 Oct 2006 06:18:04 +0000 Subject: [PATCH] Move sigqueue_take() call into proc_reparent(), this fixed bugs where proc_reparent() is called but sigqueue_take() is forgotten. --- sys/kern/kern_exit.c | 7 +++---- sys/kern/sys_process.c | 6 +----- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index 6ed8f4c0358d..6910903f3183 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -197,10 +197,6 @@ exit1(struct thread *td, int rv) while (p->p_lock > 0) msleep(&p->p_lock, &p->p_mtx, PWAIT, "exithold", 0); - PROC_LOCK(p->p_pptr); - sigqueue_take(p->p_ksi); - PROC_UNLOCK(p->p_pptr); - PROC_UNLOCK(p); #ifdef AUDIT @@ -903,6 +899,9 @@ proc_reparent(struct proc *child, struct proc *parent) if (child->p_pptr == parent) return; + PROC_LOCK(child->p_pptr); + sigqueue_take(child->p_ksi); + PROC_UNLOCK(child->p_pptr); LIST_REMOVE(child, p_sibling); LIST_INSERT_HEAD(&parent->p_children, child, p_sibling); child->p_pptr = parent; diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c index 26dd0f7cc996..0624b6f1709a 100644 --- a/sys/kern/sys_process.c +++ b/sys/kern/sys_process.c @@ -690,12 +690,8 @@ 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) { - PROC_LOCK(p->p_pptr); - sigqueue_take(p->p_ksi); - PROC_UNLOCK(p->p_pptr); + if (p->p_pptr != td->td_proc) proc_reparent(p, td->td_proc); - } data = SIGSTOP; goto sendsig; /* in PT_CONTINUE below */