Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 29 Jan 2009 14:25:33 GMT
From:      Robert Watson <rwatson@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 156860 for review
Message-ID:  <200901291425.n0TEPXrT081225@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=156860

Change 156860 by rwatson@rwatson_freebsd_capabilities on 2009/01/29 14:25:22

	When close() is called on a process descriptor and the process
	isn't yet dead, we will kill it with SIGKILL--detach the process
	from its descriptor before reparenting to init since otherwise
	init won't be able to see it in wait4() and we end up with a
	zombie.

Affected files ...

.. //depot/projects/trustedbsd/capabilities/src/sys/kern/sys_procdesc.c#10 edit

Differences ...

==== //depot/projects/trustedbsd/capabilities/src/sys/kern/sys_procdesc.c#10 (text+ko) ====

@@ -244,6 +244,12 @@
 procdesc_free(struct procdesc *pd)
 {
 
+	/*
+	 * When the last reference is released, we assert that the descriptor
+	 * has been closed, but not that the process has exited, as we will
+	 * detach the descriptor before the process dies if the descript is
+	 * closed, as we can't wait synchronously.
+	 */
 	if (refcount_release(&pd->pd_refcount)) {
 		KASSERT(pd->pd_proc == NULL,
 		    ("procdesc_free: pd_proc != NULL"));
@@ -351,9 +357,17 @@
 		/*
 		 * If the process is not yet dead, we need to kill it, but we
 		 * can't wait around synchronously for it to go away, as that
-		 * path leads to madness (and deadlocks).  Reparent the
-		 * target to init(8) so that there's someone to pick up the
-		 * pieces, then terminate with prejudice.
+		 * path leads to madness (and deadlocks).  First, detach the
+		 * process from its descriptor so that its exit status will
+		 * be reported normally.
+		 */
+		pd->pd_proc = NULL;
+		p->p_procdesc = NULL;
+		procdesc_free(pd);
+
+		/*
+		 * Next, reparent it to init(8) so that there's someone to
+		 * pick up the pieces; finally, terminate with prejudice.
 		 */
 		p->p_sigparent = SIGCHLD;
 		proc_reparent(p, initproc);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200901291425.n0TEPXrT081225>