diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2013-12-07 05:38:31 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2013-12-07 05:38:31 +0100 |
commit | 4fd55abb8e6dc11b257699cbd095fa5ef60e1ece (patch) | |
tree | b846d2a778ce003a32b07cefea4fe2ce38853e59 /sys/src/9/port/proc.c | |
parent | e2da074d284df467443612e7187855b7cf373097 (diff) |
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.
Diffstat (limited to 'sys/src/9/port/proc.c')
-rw-r--r-- | sys/src/9/port/proc.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/sys/src/9/port/proc.c b/sys/src/9/port/proc.c index bbceff5ef..838ad49a1 100644 --- a/sys/src/9/port/proc.c +++ b/sys/src/9/port/proc.c @@ -1135,7 +1135,7 @@ pexit(char *exitstr, int freemem) /* * 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; |