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.
This commit is contained in:
cinap_lenrek 2014-01-01 07:39:17 +01:00
parent 18a50d04ac
commit 1a02a45883
2 changed files with 10 additions and 1 deletions

View file

@ -29,7 +29,7 @@ pgrpnote(ulong noteid, char *a, long n, int flag)
continue;
if(up != p && p->noteid == noteid && p->kp == 0) {
qlock(&p->debug);
if(p->pid != 0 && p->noteid == noteid)
if(p->noteid == noteid)
postnote(p, 0, buf, flag);
qunlock(&p->debug);
}

View file

@ -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;