diff options
author | kib <kib@FreeBSD.org> | 2015-02-18 08:10:13 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2015-02-18 08:10:13 +0000 |
commit | e17da454eac17e85f17eadd100b88a84fead6211 (patch) | |
tree | 18b81f7ba92789242943c37d6fa5432f39e3fba4 /sys/kern/kern_procctl.c | |
parent | 4ebc3c5038dbc8fe93a04af9b7cd6712598940ce (diff) | |
download | FreeBSD-src-e17da454eac17e85f17eadd100b88a84fead6211.zip FreeBSD-src-e17da454eac17e85f17eadd100b88a84fead6211.tar.gz |
MFC r278795:
Reparenting done by debugger attach can leave reaper without direct
children. Handle the situation instead asserting that it is
impossible.
Diffstat (limited to 'sys/kern/kern_procctl.c')
-rw-r--r-- | sys/kern/kern_procctl.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/sys/kern/kern_procctl.c b/sys/kern/kern_procctl.c index 5c4b40d..734c871 100644 --- a/sys/kern/kern_procctl.c +++ b/sys/kern/kern_procctl.c @@ -160,7 +160,7 @@ static int reap_status(struct thread *td, struct proc *p, struct procctl_reaper_status *rs) { - struct proc *reap, *p2; + struct proc *reap, *p2, *first_p; sx_assert(&proctree_lock, SX_LOCKED); bzero(rs, sizeof(*rs)); @@ -176,8 +176,10 @@ reap_status(struct thread *td, struct proc *p, rs->rs_descendants = 0; rs->rs_children = 0; if (!LIST_EMPTY(&reap->p_reaplist)) { - KASSERT(!LIST_EMPTY(&reap->p_children), ("no children")); - rs->rs_pid = LIST_FIRST(&reap->p_children)->p_pid; + first_p = LIST_FIRST(&reap->p_children); + if (first_p == NULL) + first_p = LIST_FIRST(&reap->p_reaplist); + rs->rs_pid = first_p->p_pid; LIST_FOREACH(p2, &reap->p_reaplist, p_reapsibling) { if (proc_realparent(p2) == reap) rs->rs_children++; |