summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2017-04-05 00:34:07 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2017-04-05 00:34:07 +0200
commit00fbdd622aeb6ab3665a9970d7acb6bdd225028b (patch)
tree4c1c8e589cebe9a22c30648c3136c7680ea1fbd3
parent30c05fe3ddfcbbf60d0088b088fae31dcc512888 (diff)
downloadplan9front-00fbdd622aeb6ab3665a9970d7acb6bdd225028b.tar.xz
kernel: avoid waserror() botch in devwalk (from drawterm, thanks aiju)
calculate alloc flag before waserror(), as compilers like gcc will not notice the value changing later because setjump() restores the old value due to callee-saves. change is applies here to make it easier to merge with drawterm. thanks to aiju for debugging this; used to cause drawterm memory leak until compiled with gcc -O0.
-rw-r--r--sys/src/9/port/dev.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/sys/src/9/port/dev.c b/sys/src/9/port/dev.c
index 3d0eb4280..464aedc48 100644
--- a/sys/src/9/port/dev.c
+++ b/sys/src/9/port/dev.c
@@ -176,18 +176,17 @@ devwalk(Chan *c, Chan *nc, char **name, int nname, Dirtab *tab, int ntab, Devgen
if(nname > 0)
isdir(c);
- alloc = 0;
+ alloc = (nc == nil);
wq = smalloc(sizeof(Walkqid)+(nname-1)*sizeof(Qid));
if(waserror()){
- if(alloc && wq->clone!=nil)
+ if(alloc && wq->clone != nil)
cclose(wq->clone);
free(wq);
return nil;
}
- if(nc == nil){
+ if(alloc){
nc = devclone(c);
nc->type = 0; /* device doesn't know about this channel yet */
- alloc = 1;
}
wq->clone = nc;
@@ -252,7 +251,7 @@ Done:
if(alloc)
cclose(wq->clone);
wq->clone = nil;
- }else if(wq->clone){
+ }else if(wq->clone != nil){
/* attach cloned channel to same device */
wq->clone->type = c->type;
}