Fixes waserror() memory leak in devwalk
authorBarret Rhoden <brho@cs.berkeley.edu>
Sun, 12 Jan 2014 22:55:02 +0000 (14:55 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 17 Jan 2014 22:57:12 +0000 (14:57 -0800)
The alloc was being ignored by the compiler.  As far as it was
concerned, at the waserror point (where error jumps back to), there was
no way for alloc to not be 0.  So we never freed the chan wq->clone.

We'll definitely have issues like this in the future.  We need some way
to tell the compiler to forget anything it might have known before a
certain point; otherwise we'll need to drop lots of volatiles around.
Not sure why we need this but plan9 didn't.

kern/drivers/dev/dev.c

index eb03299..b24386c 100644 (file)
@@ -142,7 +142,8 @@ devwalk(struct chan *c,
        struct dirtab *tab, int ntab, Devgen *gen)
 {
        ERRSTACK(2);
-       int i, j, alloc;
+       int i, j;
+       volatile int alloc; /* to keep waserror from optimizing this out */
        struct walkqid *wq;
        char *n;
        struct dir dir;