diff options
author | Ulrich Drepper <drepper@redhat.com> | 2007-07-19 17:02:07 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2007-07-19 17:02:07 +0000 |
commit | d8d7feefa738eb3138790c99aa891ef44d85e4cc (patch) | |
tree | fd31284344efccd8bd724f12908c741fbd929f21 /libio/iopopen.c | |
parent | 2e2efe652a61fc081a0f08ecfe6c46fddead1fd0 (diff) | |
download | glibc-d8d7feefa738eb3138790c99aa891ef44d85e4cc.tar.gz |
(_IO_new_proc_open): Don't close child_std_end if one of proc_file_chain streams has that fileno.
Diffstat (limited to 'libio/iopopen.c')
-rw-r--r-- | libio/iopopen.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/libio/iopopen.c b/libio/iopopen.c index 896e930f40..d5c6305b09 100644 --- a/libio/iopopen.c +++ b/libio/iopopen.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1993, 1997-2002, 2003, 2004 Free Software Foundation, Inc. +/* Copyright (C) 1993, 1997-2002, 2003, 2004, 2007 + Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Per Bothner <bothner@cygnus.com>. @@ -169,7 +170,15 @@ _IO_new_proc_open (fp, command, mode) popen() calls that remain open in the parent process are closed in the new child process." */ for (p = proc_file_chain; p; p = p->next) - _IO_close (_IO_fileno ((_IO_FILE *) p)); + { + int fd = _IO_fileno ((_IO_FILE *) p); + + /* If any stream from previous popen() calls has fileno + child_std_end, it has been already closed by the dup2 syscall + above. */ + if (fd != child_std_end) + _IO_close (fd); + } _IO_execl ("/bin/sh", "sh", "-c", command, (char *) 0); _IO__exit (127); |