diff options
Diffstat (limited to 'sys/src/9/ip/devip.c')
| -rw-r--r-- | sys/src/9/ip/devip.c | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/sys/src/9/ip/devip.c b/sys/src/9/ip/devip.c index 93a8514b4..7e7b379b4 100644 --- a/sys/src/9/ip/devip.c +++ b/sys/src/9/ip/devip.c @@ -407,13 +407,8 @@ ipopen(Chan* c, int omode) case Qclone: p = f->p[PROTO(c->qid)]; qlock(p); - if(waserror()){ - qunlock(p); - nexterror(); - } cv = Fsprotoclone(p, ATTACHER(c)); qunlock(p); - poperror(); if(cv == nil) { error(Enodev); break; @@ -1285,21 +1280,33 @@ retry: if(c == nil){ c = malloc(sizeof(Conv)); if(c == nil) - error(Enomem); - qlock(c); + return nil; + if(waserror()){ + qfree(c->rq); + qfree(c->wq); + qfree(c->eq); + qfree(c->sq); + free(c->ptcl); + free(c); + return nil; + } 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); - } } - *pp = c; - p->ac++; 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++; break; } if(canqlock(c)){ |
