ref: 4fd55abb8e6dc11b257699cbd095fa5ef60e1ece
parent: e2da074d284df467443612e7187855b7cf373097
author: cinap_lenrek <[email protected]>
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;