Index: libiberty/pex-win32.c =================================================================== --- libiberty/pex-win32.c (revision 246292) +++ libiberty/pex-win32.c (working copy) @@ -730,7 +730,7 @@ spawn_script (const char *executable, ch /* Execute a child. */ static pid_t -pex_win32_exec_child (struct pex_obj *obj ATTRIBUTE_UNUSED, int flags, +pex_win32_exec_child (struct pex_obj *obj, int flags, const char *executable, char * const * argv, char* const* env, int in, int out, int errdes, @@ -746,6 +746,25 @@ pex_win32_exec_child (struct pex_obj *ob OSVERSIONINFO version_info; STARTUPINFO si; PROCESS_INFORMATION pi; + int orig_out, orig_in, orig_err; + BOOL separate_stderr = !(flags & PEX_STDERR_TO_STDOUT); + + /* Ensure we have inheritable descriptors to pass to the child, and close the + original descriptors. */ + orig_in = in; + in = _dup (orig_in); + obj->funcs->close (obj, orig_in); + + orig_out = out; + out = _dup (orig_out); + obj->funcs->close (obj, orig_out); + + if (separate_stderr) + { + orig_err = errdes; + errdes = _dup (orig_err); + obj->funcs->close (obj, orig_err); + } stdin_handle = INVALID_HANDLE_VALUE; stdout_handle = INVALID_HANDLE_VALUE; @@ -753,7 +772,7 @@ pex_win32_exec_child (struct pex_obj *ob stdin_handle = (HANDLE) _get_osfhandle (in); stdout_handle = (HANDLE) _get_osfhandle (out); - if (!(flags & PEX_STDERR_TO_STDOUT)) + if (separate_stderr) stderr_handle = (HANDLE) _get_osfhandle (errdes); else stderr_handle = stdout_handle; @@ -822,8 +841,11 @@ pex_win32_exec_child (struct pex_obj *ob *errmsg = "CreateProcess"; } - /* Close the standard output and standard error handles in the - parent. */ + /* Close the standard input, standard output and standard error handles + in the parent. */ + + if (in != STDIN_FILENO) + obj->funcs->close (obj, in); if (out != STDOUT_FILENO) obj->funcs->close (obj, out); if (errdes != STDERR_FILENO) @@ -883,7 +905,7 @@ static int pex_win32_pipe (struct pex_obj *obj ATTRIBUTE_UNUSED, int *p, int binary) { - return _pipe (p, 256, binary ? _O_BINARY : _O_TEXT); + return _pipe (p, 256, (binary ? _O_BINARY : _O_TEXT) | _O_NOINHERIT); } /* Get a FILE pointer to read from a file descriptor. */