diff options
author | sandra <sandra@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-07-26 23:18:47 +0000 |
---|---|---|
committer | sandra <sandra@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-07-26 23:18:47 +0000 |
commit | 893a47950b656141df770b274637bc1f0beb9fda (patch) | |
tree | 5bb79d01d34e0a177c2f1d1b9375c4447d077918 /libiberty | |
parent | 4a1f6fe28080dc278b80860019dd04605c4830ee (diff) | |
download | gcc-893a47950b656141df770b274637bc1f0beb9fda.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@189901 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libiberty')
-rw-r--r-- | libiberty/ChangeLog | 6 | ||||
-rw-r--r-- | libiberty/pex-win32.c | 25 |
2 files changed, 23 insertions, 8 deletions
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index 716a2ce9d23..349dc98eb06 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,9 @@ +2012-07-26 Kazu Hirata <kazu@codesourcery.com> + Sandra Loosemore <sandra@codesourcery.com> + + * pex-win32.c (pex_win32_exec_child): Only close original file + descriptors if child is launched successfully. + 2012-07-18 Jason Merrill <jason@redhat.com> * cp-demangle.c (cplus_demangle_operators): Add *_cast. diff --git a/libiberty/pex-win32.c b/libiberty/pex-win32.c index 107ac6fdcc1..eae72c51dc0 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. */ |