[Python-checkins] r87744 - python/branches/py3k/Lib/subprocess.py

antoine.pitrou python-checkins at python.org
Tue Jan 4 20:07:07 CET 2011


Author: antoine.pitrou
Date: Tue Jan  4 20:07:07 2011
New Revision: 87744

Log:
In subprocess, wrap pipe fds before launching the child. Hopefully this
will fix intermittent failures on some buildbots (issue #8458).



Modified:
   python/branches/py3k/Lib/subprocess.py

Modified: python/branches/py3k/Lib/subprocess.py
==============================================================================
--- python/branches/py3k/Lib/subprocess.py	(original)
+++ python/branches/py3k/Lib/subprocess.py	Tue Jan  4 20:07:07 2011
@@ -699,13 +699,9 @@
          c2pread, c2pwrite,
          errread, errwrite) = self._get_handles(stdin, stdout, stderr)
 
-        self._execute_child(args, executable, preexec_fn, close_fds,
-                            pass_fds, cwd, env, universal_newlines,
-                            startupinfo, creationflags, shell,
-                            p2cread, p2cwrite,
-                            c2pread, c2pwrite,
-                            errread, errwrite,
-                            restore_signals, start_new_session)
+        # We wrap OS handles *before* launching the child, otherwise a
+        # quickly terminating child could make our fds unwrappable
+        # (see #8458).
 
         if mswindows:
             if p2cwrite != -1:
@@ -730,6 +726,24 @@
             if universal_newlines:
                 self.stderr = io.TextIOWrapper(self.stderr)
 
+        try:
+            self._execute_child(args, executable, preexec_fn, close_fds,
+                                pass_fds, cwd, env, universal_newlines,
+                                startupinfo, creationflags, shell,
+                                p2cread, p2cwrite,
+                                c2pread, c2pwrite,
+                                errread, errwrite,
+                                restore_signals, start_new_session)
+        except:
+            # Cleanup if the child failed starting
+            for f in filter(None, [self.stdin, self.stdout, self.stderr]):
+                try:
+                    f.close()
+                except EnvironmentError:
+                    # Ignore EBADF or other errors
+                    pass
+            raise
+
 
     def _translate_newlines(self, data, encoding):
         data = data.replace(b"\r\n", b"\n").replace(b"\r", b"\n")


More information about the Python-checkins mailing list