Skip to content

Commit

Permalink
2012-07-26 Kazu Hirata <kazu@codesourcery.com>
Browse files Browse the repository at this point in the history
	    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
  • Loading branch information
sandra committed Jul 26, 2012
1 parent 4a1f6fe commit 893a479
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 8 deletions.
6 changes: 6 additions & 0 deletions libiberty/ChangeLog
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
25 changes: 17 additions & 8 deletions libiberty/pex-win32.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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. */

Expand Down

0 comments on commit 893a479

Please sign in to comment.