2006-08-22 Eric Blake <ebb9@byu.net>

* libc/posix/popen.c (popen): Don't close output end of pipe in
        child if stdout was closed on entry.
        [HAVE_FCNTL]: In parent, mark file as close-on-exec, per POSIX.
This commit is contained in:
Jeff Johnston 2006-08-22 20:30:37 +00:00
parent cb5e3d1df7
commit 380d8ec45d
2 changed files with 17 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2006-08-22 Eric Blake <ebb9@byu.net>
* libc/posix/popen.c (popen): Don't close output end of pipe in
child if stdout was closed on entry.
[HAVE_FCNTL]: In parent, mark file as close-on-exec, per POSIX.
2006-08-19 Ramana Radhakrishnan <ramana.r@gmail.com>
* sys/types.h: Correct syntax error caused by missing '\' on #ifdef

View File

@ -1,7 +1,7 @@
/* $NetBSD: popen.c,v 1.11 1995/06/16 07:05:33 jtc Exp $ */
/*
* Copyright (c) 1988, 1993
* Copyright (c) 1988, 1993, 2006
* The Regents of the University of California. All rights reserved.
*
* This code is derived from software written by Ken Arnold and
@ -55,6 +55,7 @@ static char rcsid[] = "$NetBSD: popen.c,v 1.11 1995/06/16 07:05:33 jtc Exp $";
#include <stdlib.h>
#include <string.h>
#include <paths.h>
#include <fcntl.h>
static struct pid {
struct pid *next;
@ -102,7 +103,9 @@ _DEFUN(popen, (program, type),
(void)dup2(pdes[1], STDOUT_FILENO);
(void)close(pdes[1]);
}
(void) close(pdes[0]);
if (pdes[0] != STDOUT_FILENO) {
(void) close(pdes[0]);
}
} else {
if (pdes[0] != STDIN_FILENO) {
(void)dup2(pdes[0], STDIN_FILENO);
@ -129,6 +132,12 @@ _DEFUN(popen, (program, type),
(void)close(pdes[0]);
}
#ifdef HAVE_FCNTL
/* Hide pipe from future popens; assume fcntl can't fail. */
fcntl (fileno (iop), F_SETFD,
fcntl (fileno (iop), F_GETFD, 0) | FD_CLOEXEC);
#endif /* HAVE_FCNTL */
/* Link into list of file descriptors. */
cur->fp = iop;
cur->pid = pid;