diff --git a/pipe.c b/pipe.c
index 5e1fed20f832aea92d7b37de929d900317e45d73..cd27cbf896aa2f56cb4aca68425789ae9b818426 100644
--- a/pipe.c
+++ b/pipe.c
@@ -25,12 +25,10 @@ pipe_alloc(struct file **f0, struct file **f1)
 
   p = 0;
   *f0 = *f1 = 0;
-  if((*f0 = filealloc()) == 0)
-    goto oops;
-  if((*f1 = filealloc()) == 0)
-    goto oops;
-  if((p = (struct pipe*) kalloc(PAGE)) == 0)
-    goto oops;
+  if((*f0 = filealloc()) == 0 || (*f1 = filealloc()) == 0)
+    goto bad;
+  if((p = (struct pipe*)kalloc(PAGE)) == 0)
+    goto bad;
   p->readopen = 1;
   p->writeopen = 1;
   p->writep = 0;
@@ -46,9 +44,9 @@ pipe_alloc(struct file **f0, struct file **f1)
   (*f1)->pipe = p;
   return 0;
 
- oops:
+ bad:
   if(p)
-    kfree((char*) p, PAGE);
+    kfree((char*)p, PAGE);
   if(*f0){
     (*f0)->type = FD_NONE;
     fileclose(*f0);
@@ -74,7 +72,7 @@ pipe_close(struct pipe *p, int writable)
   release(&p->lock);
 
   if(p->readopen == 0 && p->writeopen == 0)
-    kfree((char*) p, PAGE);
+    kfree((char*)p, PAGE);
 }
 
 //PAGEBREAK: 20
@@ -107,10 +105,10 @@ pipe_read(struct pipe *p, char *addr, int n)
   int i;
 
   acquire(&p->lock);
-  while(p->readp == p->writep){
-    if(p->writeopen == 0 || cp->killed){
+  while(p->readp == p->writep && p->writeopen){
+    if(cp->killed){
       release(&p->lock);
-      return 0;
+      return -1;
     }
     sleep(&p->readp, &p->lock);
   }