Index: libiberty/pex-win32.c |
diff --git a/libiberty/pex-win32.c b/libiberty/pex-win32.c |
index 107ac6fdcc1e8a0dbfa003dc6d59e4bc76fb6db5..eae72c51dc0a2662db01b16c43abdf20590ac027 100644 |
--- a/libiberty/pex-win32.c |
+++ b/libiberty/pex-win32.c |
@@ -741,24 +741,17 @@ pex_win32_exec_child (struct pex_obj *obj ATTRIBUTE_UNUSED, int flags, |
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. */ |
+ /* Ensure we have inheritable descriptors to pass to the child. */ |
orig_in = in; |
in = _dup (orig_in); |
- if (orig_in != STDIN_FILENO) |
- _close (orig_in); |
orig_out = out; |
out = _dup (orig_out); |
- if (orig_out != STDOUT_FILENO) |
- _close (orig_out); |
if (separate_stderr) |
{ |
orig_err = errdes; |
errdes = _dup (orig_err); |
- if (orig_err != STDERR_FILENO) |
- _close (orig_err); |
} |
stdin_handle = INVALID_HANDLE_VALUE; |
@@ -836,6 +829,22 @@ pex_win32_exec_child (struct pex_obj *obj ATTRIBUTE_UNUSED, int flags, |
*errmsg = "CreateProcess"; |
} |
+ /* If the child was created successfully, close the original file |
+ descriptors. If the process creation fails, these are closed by |
+ pex_run_in_environment instead. We must not close them twice as |
+ that seems to cause a Windows exception. */ |
+ |
+ if (pid != (pid_t) -1) |
+ { |
+ if (orig_in != STDIN_FILENO) |
+ _close (orig_in); |
+ if (orig_out != STDOUT_FILENO) |
+ _close (orig_out); |
+ if (separate_stderr |
+ && orig_err != STDERR_FILENO) |
+ _close (orig_err); |
+ } |
+ |
/* Close the standard input, standard output and standard error handles |
in the parent. */ |