merge from gcc
authorDJ Delorie <dj@redhat.com>
Fri, 27 Jul 2012 00:02:21 +0000 (00:02 +0000)
committerDJ Delorie <dj@redhat.com>
Fri, 27 Jul 2012 00:02:21 +0000 (00:02 +0000)
libiberty/ChangeLog
libiberty/pex-win32.c

index 716a2ce..349dc98 100644 (file)
@@ -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.
index 107ac6f..eae72c5 100644 (file)
@@ -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.  */