From b48b62307e774a3be581d1172bb1e6cdb14b89f8 Mon Sep 17 00:00:00 2001 From: Guanqun Lu Date: Fri, 2 May 2008 11:01:55 +0800 Subject: [PATCH] eliminate pipe race. Signed-off-by: Guanqun Lu --- lib/fd.c | 5 +++-- lib/pipe.c | 8 +++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/fd.c b/lib/fd.c index 3811786..f7671f8 100644 --- a/lib/fd.c +++ b/lib/fd.c @@ -179,8 +179,6 @@ dup(int oldfdnum, int newfdnum) ova = fd2data(oldfd); nva = fd2data(newfd); - if ((r = sys_page_map(0, oldfd, 0, newfd, vpt[VPN(oldfd)] & PTE_USER)) < 0) - goto err; if (vpd[PDX(ova)]) { for (i = 0; i < PTSIZE; i += PGSIZE) { pte = vpt[VPN(ova + i)]; @@ -192,6 +190,9 @@ dup(int oldfdnum, int newfdnum) } } + if ((r = sys_page_map(0, oldfd, 0, newfd, vpt[VPN(oldfd)] & PTE_USER)) < 0) + goto err; + return newfdnum; err: diff --git a/lib/pipe.c b/lib/pipe.c index 20cbf24..85f5f40 100644 --- a/lib/pipe.c +++ b/lib/pipe.c @@ -191,6 +191,12 @@ pipestat(struct Fd *fd, struct Stat *stat) static int pipeclose(struct Fd *fd) { - return sys_page_unmap(0, fd2data(fd)); + void *p; + int r; + + p = fd2data(fd); + if ((r = sys_page_unmap(0, fd)) < 0) + return r; + return sys_page_unmap(0, p); } -- 2.11.4.GIT