summaryrefslogtreecommitdiff
path: root/sys/src/9/port/proc.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2014-01-01 07:39:17 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2014-01-01 07:39:17 +0100
commit1a02a458839fd85ff58856a666918db1d111adec (patch)
treec1aaa0bbc4f1ed2467f373b8480457b8205ead25 /sys/src/9/port/proc.c
parent18a50d04ac1587ad8119feffcc1fa9f7b9b90c6d (diff)
kernel: nil check, exited procs handling in postnote()
make sure not to dereference Proc* nil pointer. this can potentially happen from devip which has code like: if(er->read4p) postnote(er->read4p, 1, "unbind", 0); the process it is about to kill can zero er->read4p at any time, so there is the possibility of the condition to be true and then er->read4p becoming nil. check if the process has already exited (p->pid == 0) in postnote() under p->debug qlock.
Diffstat (limited to 'sys/src/9/port/proc.c')
-rw-r--r--sys/src/9/port/proc.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/sys/src/9/port/proc.c b/sys/src/9/port/proc.c
index 41cfb9aff..911bfd608 100644
--- a/sys/src/9/port/proc.c
+++ b/sys/src/9/port/proc.c
@@ -903,9 +903,18 @@ postnote(Proc *p, int dolock, char *n, int flag)
int s, ret;
QLock *q;
+ if(p == nil)
+ return 0;
+
if(dolock)
qlock(&p->debug);
+ if(p->pid == 0){
+ if(dolock)
+ qunlock(&p->debug);
+ return 0;
+ }
+
if(n != nil && flag != NUser && (p->notify == 0 || p->notified))
p->nnote = 0;