devip: handle malloc errors, fix queue leaks

Fsprotocone():

qopen() and qbypass() can fail and return nil, so make sure
the connection was not partially created by checking if read
and write queues have been setup by the protocol create hanler.
on error, free any resources of the partial connection and
error out.

netlogopen(): check malloc() error.
This commit is contained in:
cinap_lenrek 2013-05-05 03:56:11 +02:00
parent 30d7276d69
commit 9500191af6
3 changed files with 25 additions and 8 deletions

View file

@ -1286,20 +1286,32 @@ retry:
c = malloc(sizeof(Conv));
if(c == nil)
error(Enomem);
qlock(c);
if(waserror()){
qfree(c->rq);
qfree(c->wq);
qfree(c->eq);
qfree(c->sq);
free(c->ptcl);
free(c);
nexterror();
}
c->p = p;
c->x = pp - p->conv;
if(p->ptclsize != 0){
c->ptcl = malloc(p->ptclsize);
if(c->ptcl == nil) {
free(c);
if(c->ptcl == nil)
error(Enomem);
}
}
c->eq = qopen(1024, Qmsg, 0, 0);
if(c->eq == nil)
error(Enomem);
(*p->create)(c);
if(c->rq == nil || c->wq == nil)
error(Enomem);
poperror();
qlock(c);
*pp = c;
p->ac++;
c->eq = qopen(1024, Qmsg, 0, 0);
(*p->create)(c);
break;
}
if(canqlock(c)){

View file

@ -316,8 +316,10 @@ ipifccreate(Conv *c)
Ipifc *ifc;
c->rq = qopen(QMAX, 0, 0, 0);
c->sq = qopen(QMAX, 0, 0, 0);
c->wq = qopen(QMAX, Qkick, ipifckick, c);
c->sq = qopen(QMAX, 0, 0, 0);
if(c->rq == nil || c->wq == nil || c->sq == nil)
error(Enomem);
ifc = (Ipifc*)c->ptcl;
ifc->conv = c;
ifc->unbinding = 0;

View file

@ -85,8 +85,11 @@ netlogopen(Fs *f)
nexterror();
}
if(f->alog->opens == 0){
if(f->alog->buf == nil)
if(f->alog->buf == nil){
f->alog->buf = malloc(Nlog);
if(f->alog->buf == nil)
error(Enomem);
}
f->alog->rptr = f->alog->buf;
f->alog->end = f->alog->buf + Nlog;
}