Fix pipeclose()'s wild write
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 24 Jul 2015 22:54:35 +0000 (18:54 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 28 Jul 2015 23:57:18 +0000 (19:57 -0400)
The qunlock after decref is broken, since it uses the pointer after
freeing the memory.  It'd pop up as a wild write, where suddenly we're
writing a 0 somewhere.

It's also just weird to unlock in the release method.

kern/drivers/dev/pipe.c

index da2dba8..959a146 100644 (file)
@@ -58,7 +58,6 @@ static void freepipe(Pipe * p)
 static void pipe_release(struct kref *kref)
 {
        Pipe *pipe = container_of(kref, Pipe, ref);
-       qunlock(&pipe->qlock);
        freepipe(pipe);
 }
 
@@ -286,11 +285,11 @@ static void pipeclose(struct chan *c)
                qreopen(p->q[1]);
        }
 
+       qunlock(&p->qlock);
        /*
         *  free the structure on last close
         */
        kref_put(&p->ref);
-       qunlock(&p->qlock);
 }
 
 static long piperead(struct chan *c, void *va, long n, int64_t ignored)