diff options
author | Julian Brown <julian@codesourcery.com> | 2009-04-29 11:52:41 +0000 |
---|---|---|
committer | Julian Brown <julian@codesourcery.com> | 2009-04-29 11:52:41 +0000 |
commit | 59cdf8427011bbf8a562fbb419923a5af28d52b4 (patch) | |
tree | 8e6713716d677ba7bea57d47de6d7ed53ba7d035 /libiberty | |
parent | 484086b7e06069d8bc3dce0dd428d3b9fcf9053b (diff) | |
download | gdb-59cdf8427011bbf8a562fbb419923a5af28d52b4.zip gdb-59cdf8427011bbf8a562fbb419923a5af28d52b4.tar.gz gdb-59cdf8427011bbf8a562fbb419923a5af28d52b4.tar.bz2 |
libiberty/
* pex-win32.c (pex_win32_pipe): Add _O_NOINHERIT.
(pex_win32_exec_child): Ensure each process has only one handle open
on pipe endpoints. Close standard input after creating child
for symmetry with standard output/standard error.
Diffstat (limited to 'libiberty')
-rw-r--r-- | libiberty/ChangeLog | 7 | ||||
-rw-r--r-- | libiberty/pex-win32.c | 34 |
2 files changed, 35 insertions, 6 deletions
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index 2e93c98..58f401d 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,10 @@ +2009-04-29 Julian Brown <julian@codesourcery.com> + + * pex-win32.c (pex_win32_pipe): Add _O_NOINHERIT. + (pex_win32_exec_child): Ensure each process has only one handle open + on pipe endpoints. Close standard input after creating child + for symmetry with standard output/standard error. + 2009-04-25 Eli Zaretskii <eliz@gnu.org> * Makefile.in (needed-list): Target removed (not used in GCC diff --git a/libiberty/pex-win32.c b/libiberty/pex-win32.c index 3f37751..30ef435 100644 --- a/libiberty/pex-win32.c +++ b/libiberty/pex-win32.c @@ -746,6 +746,25 @@ pex_win32_exec_child (struct pex_obj *obj ATTRIBUTE_UNUSED, int flags, 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); + _close (orig_in); + + orig_out = out; + out = _dup (orig_out); + _close (orig_out); + + if (separate_stderr) + { + orig_err = errdes; + errdes = _dup (orig_err); + _close (orig_err); + } stdin_handle = INVALID_HANDLE_VALUE; stdout_handle = INVALID_HANDLE_VALUE; @@ -753,7 +772,7 @@ pex_win32_exec_child (struct pex_obj *obj ATTRIBUTE_UNUSED, int flags, 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,12 +841,15 @@ pex_win32_exec_child (struct pex_obj *obj ATTRIBUTE_UNUSED, int flags, *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) + _close (in); if (out != STDOUT_FILENO) - obj->funcs->close (obj, out); + _close (out); if (errdes != STDERR_FILENO) - obj->funcs->close (obj, errdes); + _close (errdes); return pid; } @@ -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. */ |