summaryrefslogtreecommitdiff
path: root/sys/src/9/ip/devip.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/src/9/ip/devip.c')
-rw-r--r--sys/src/9/ip/devip.c31
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)){