diff options
author | rtm <rtm> | 2006-07-18 19:22:37 +0000 |
---|---|---|
committer | rtm <rtm> | 2006-07-18 19:22:37 +0000 |
commit | bd228a81566befa6154807d327d8c873f6a76c79 (patch) | |
tree | 5e514950688f29a3150ec9c43c478c8208435c87 /pipe.c | |
parent | 0dd4253747eef56d0f1539fac7d62234f6af5f51 (diff) | |
download | xv6-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.c | 5 |
1 files changed, 5 insertions, 0 deletions
@@ -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); } |