summaryrefslogtreecommitdiff
path: root/sys/kern/sys_pipe.c
diff options
context:
space:
mode:
authorMatthew Dillon <dillon@FreeBSD.org>2000-11-18 21:01:04 +0000
committerMatthew Dillon <dillon@FreeBSD.org>2000-11-18 21:01:04 +0000
commit279d7226048c39b48b788e5ea5607c0dbc042acd (patch)
tree8d32488eeb453793eb19bb380ffcc26e97ca77fd /sys/kern/sys_pipe.c
parentd641426e5acce54fd775c3be86ddb9c2e78e8540 (diff)
Notes
Diffstat (limited to 'sys/kern/sys_pipe.c')
-rw-r--r--sys/kern/sys_pipe.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/sys/kern/sys_pipe.c b/sys/kern/sys_pipe.c
index 7600ffdca736..4c505e7ce55e 100644
--- a/sys/kern/sys_pipe.c
+++ b/sys/kern/sys_pipe.c
@@ -185,6 +185,7 @@ pipe(p, uap)
error = falloc(p, &rf, &fd);
if (error)
goto free2;
+ fhold(rf);
p->p_retval[0] = fd;
rf->f_flag = FREAD | FWRITE;
rf->f_type = DTYPE_PIPE;
@@ -201,11 +202,15 @@ pipe(p, uap)
rpipe->pipe_peer = wpipe;
wpipe->pipe_peer = rpipe;
+ fdrop(rf, p);
return (0);
free3:
- fdp->fd_ofiles[p->p_retval[0]] = 0;
- ffree(rf);
+ if (fdp->fd_ofiles[p->p_retval[0]] == rf) {
+ fdp->fd_ofiles[p->p_retval[0]] = NULL;
+ fdrop(rf, p);
+ }
+ fdrop(rf, p);
free2:
(void)pipeclose(wpipe);
(void)pipeclose(rpipe);