aboutsummaryrefslogtreecommitdiff
path: root/libiberty/pex-win32.c
diff options
context:
space:
mode:
authorKazu Hirata <kazu@codesourcery.com>2012-07-26 23:18:47 +0000
committerSandra Loosemore <sandra@gcc.gnu.org>2012-07-26 19:18:47 -0400
commit9cd6dd82398c07551d428e2943a7d8429c4650c0 (patch)
tree5bb79d01d34e0a177c2f1d1b9375c4447d077918 /libiberty/pex-win32.c
parent3984ea61cb3e47663b34655b7f62726260a23eb3 (diff)
downloadgcc-9cd6dd82398c07551d428e2943a7d8429c4650c0.zip
gcc-9cd6dd82398c07551d428e2943a7d8429c4650c0.tar.gz
gcc-9cd6dd82398c07551d428e2943a7d8429c4650c0.tar.bz2
pex-win32.c (pex_win32_exec_child): Only close original file descriptors if child is launched successfully.
2012-07-26 Kazu Hirata <kazu@codesourcery.com> Sandra Loosemore <sandra@codesourcery.com> libiberty/ * pex-win32.c (pex_win32_exec_child): Only close original file descriptors if child is launched successfully. Co-Authored-By: Sandra Loosemore <sandra@codesourcery.com> From-SVN: r189901
Diffstat (limited to 'libiberty/pex-win32.c')
-rw-r--r--libiberty/pex-win32.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/libiberty/pex-win32.c b/libiberty/pex-win32.c
index 107ac6f..eae72c5 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. */