summaryrefslogtreecommitdiff
path: root/pipe.c
diff options
context:
space:
mode:
authorrtm <rtm>2006-07-18 19:22:37 +0000
committerrtm <rtm>2006-07-18 19:22:37 +0000
commitbd228a81566befa6154807d327d8c873f6a76c79 (patch)
tree5e514950688f29a3150ec9c43c478c8208435c87 /pipe.c
parent0dd4253747eef56d0f1539fac7d62234f6af5f51 (diff)
downloadxv6-labs-bd228a81566befa6154807d327d8c873f6a76c79.tar.gz
xv6-labs-bd228a81566befa6154807d327d8c873f6a76c79.tar.bz2
xv6-labs-bd228a81566befa6154807d327d8c873f6a76c79.zip
prevent longjmp / forkret from writing over tf->edi
Diffstat (limited to 'pipe.c')
-rw-r--r--pipe.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/pipe.c b/pipe.c
index 7ebe006..c8da428 100644
--- a/pipe.c
+++ b/pipe.c
@@ -61,6 +61,8 @@ pipe_alloc(struct fd **fd1, struct fd **fd2)
void
pipe_close(struct pipe *p, int writeable)
{
+ acquire(&p->lock);
+
if(writeable){
p->writeopen = 0;
wakeup(&p->readp);
@@ -68,6 +70,9 @@ pipe_close(struct pipe *p, int writeable)
p->readopen = 0;
wakeup(&p->writep);
}
+
+ release(&p->lock);
+
if(p->readopen == 0 && p->writeopen == 0)
kfree((char *) p, PAGE);
}