From owner-svn-src-head@FreeBSD.ORG Mon Apr 2 19:35:37 2012 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 14F7F1065672; Mon, 2 Apr 2012 19:35:37 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 00B188FC17; Mon, 2 Apr 2012 19:35:37 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q32JZah1013650; Mon, 2 Apr 2012 19:35:36 GMT (envelope-from kib@svn.freebsd.org) Received: (from kib@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q32JZaPI013648; Mon, 2 Apr 2012 19:35:36 GMT (envelope-from kib@svn.freebsd.org) Message-Id: <201204021935.q32JZaPI013648@svn.freebsd.org> From: Konstantin Belousov Date: Mon, 2 Apr 2012 19:35:36 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r233809 - head/sys/kern X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 02 Apr 2012 19:35:37 -0000 Author: kib Date: Mon Apr 2 19:35:36 2012 New Revision: 233809 URL: http://svn.freebsd.org/changeset/base/233809 Log: When process exists, not only the children shall be reparented to init, but also the orphans shall be removed from the orphan list, because the list header is destroyed. Reported and tested by: pho MFC after: 3 days Modified: head/sys/kern/kern_exit.c Modified: head/sys/kern/kern_exit.c ============================================================================== --- head/sys/kern/kern_exit.c Mon Apr 2 19:34:56 2012 (r233808) +++ head/sys/kern/kern_exit.c Mon Apr 2 19:35:36 2012 (r233809) @@ -430,6 +430,13 @@ exit1(struct thread *td, int rv) if (q->p_flag & P_TRACED) { struct thread *temp; + /* + * Since q was found on our children list, the + * proc_reparent() call moved q to the orphan + * list due to present P_TRACED flag. Clear + * orphan link for q now while q is locked. + */ + clear_orphan(q); q->p_flag &= ~(P_TRACED | P_STOPPED_TRACE); FOREACH_THREAD_IN_PROC(q, temp) temp->td_dbgflags &= ~TDB_SUSPEND; @@ -438,6 +445,15 @@ exit1(struct thread *td, int rv) PROC_UNLOCK(q); } + /* + * Also get rid of our orphans. + */ + while ((q = LIST_FIRST(&p->p_orphans)) != NULL) { + PROC_LOCK(q); + clear_orphan(q); + PROC_UNLOCK(q); + } + /* Save exit status. */ PROC_LOCK(p); p->p_xthread = td;