git: 9front

Download patch

ref: 631adffb000db83dcf3820bd845ce9244197b105
parent: a8f66252502735b2ba789297d1be568b5fd76499
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sat Dec 7 00:38:31 EST 2013

kernel: fix pexit() Waitmsg memory leak.

when a process got forked with RFNOWAIT, its p->parent will still
point to the parent process, but its p->parentpid == 0.

this causes the "parent still alive" check in pexit to get confused
as it only checked p->pid == up->parentpid. this condition is *TRUE*
in the case of RFNOWAIT when the parent process is actually dead
(p->pid == 0) so we attached the wait structure to the dead parent
leaking the memory.

--- a/sys/src/9/port/proc.c
+++ b/sys/src/9/port/proc.c
@@ -1135,7 +1135,7 @@
 		/*
 		 * Check that parent is still alive.
 		 */
-		if(p->pid == up->parentpid && p->state != Broken) {
+		if(p->pid != 0 && p->pid == up->parentpid && p->state != Broken) {
 			p->nchild--;
 			p->time[TCUser] += utime;
 			p->time[TCSys] += stime;
--