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:
parent
30d7276d69
commit
9500191af6
3 changed files with 25 additions and 8 deletions
|
@ -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)){
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue