]> granicus.if.org Git - python/commitdiff
Merged revisions 70137 via svnmerge from
authorHirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
Tue, 3 Mar 2009 22:41:26 +0000 (22:41 +0000)
committerHirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
Tue, 3 Mar 2009 22:41:26 +0000 (22:41 +0000)
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r70137 | hirokazu.yamamoto | 2009-03-04 07:18:14 +0900 | 1 line

  Issue #5179: Fixed subprocess handle leak on failure on windows.
........

Lib/subprocess.py
Misc/NEWS
PC/_subprocess.c

index c461b254f6de7ee738dd298c12e065d27dc3242f..638058ee61f2b713650ae4bda25e10e49a9f3012 100644 (file)
@@ -638,21 +638,13 @@ class Popen(object):
                             c2pread, c2pwrite,
                             errread, errwrite)
 
-        # On Windows, you cannot just redirect one or two handles: You
-        # either have to redirect all three or none. If the subprocess
-        # user has only redirected one or two handles, we are
-        # automatically creating PIPEs for the rest. We should close
-        # these after the process is started. See bug #1124861.
         if mswindows:
-            if stdin is None and p2cwrite is not None:
-                os.close(p2cwrite)
-                p2cwrite = None
-            if stdout is None and c2pread is not None:
-                os.close(c2pread)
-                c2pread = None
-            if stderr is None and errread is not None:
-                os.close(errread)
-                errread = None
+            if p2cwrite is not None:
+                p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0)
+            if c2pread is not None:
+                c2pread = msvcrt.open_osfhandle(c2pread.Detach(), 0)
+            if errread is not None:
+                errread = msvcrt.open_osfhandle(errread.Detach(), 0)
 
         if bufsize == 0:
             bufsize = 1  # Nearly unbuffered (XXX for now)
@@ -737,13 +729,10 @@ class Popen(object):
 
             if stdin is None:
                 p2cread = GetStdHandle(STD_INPUT_HANDLE)
-            if p2cread is not None:
-                pass
-            elif stdin is None or stdin == PIPE:
+                if p2cread is None:
+                    p2cread, _ = CreatePipe(None, 0)
+            elif stdin == PIPE:
                 p2cread, p2cwrite = CreatePipe(None, 0)
-                # Detach and turn into fd
-                p2cwrite = p2cwrite.Detach()
-                p2cwrite = msvcrt.open_osfhandle(p2cwrite, 0)
             elif isinstance(stdin, int):
                 p2cread = msvcrt.get_osfhandle(stdin)
             else:
@@ -753,13 +742,10 @@ class Popen(object):
 
             if stdout is None:
                 c2pwrite = GetStdHandle(STD_OUTPUT_HANDLE)
-            if c2pwrite is not None:
-                pass
-            elif stdout is None or stdout == PIPE:
+                if c2pwrite is None:
+                    _, c2pwrite = CreatePipe(None, 0)
+            elif stdout == PIPE:
                 c2pread, c2pwrite = CreatePipe(None, 0)
-                # Detach and turn into fd
-                c2pread = c2pread.Detach()
-                c2pread = msvcrt.open_osfhandle(c2pread, 0)
             elif isinstance(stdout, int):
                 c2pwrite = msvcrt.get_osfhandle(stdout)
             else:
@@ -769,13 +755,10 @@ class Popen(object):
 
             if stderr is None:
                 errwrite = GetStdHandle(STD_ERROR_HANDLE)
-            if errwrite is not None:
-                pass
-            elif stderr is None or stderr == PIPE:
+                if errwrite is None:
+                    _, errwrite = CreatePipe(None, 0)
+            elif stderr == PIPE:
                 errread, errwrite = CreatePipe(None, 0)
-                # Detach and turn into fd
-                errread = errread.Detach()
-                errread = msvcrt.open_osfhandle(errread, 0)
             elif stderr == STDOUT:
                 errwrite = c2pwrite
             elif isinstance(stderr, int):
index 0a7a53b72c6aa025fbb9246252f2f13f2bd91049..702e02f119c14505e56f9746ba69cb8fb54aaaad 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -181,6 +181,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #5179: Fixed subprocess handle leak on failure on windows.
+
 - PEP 372:  Added collections.OrderedDict().
 
 - The _asdict() for method for namedtuples now returns an OrderedDict().
index 99cbd24459d1783d8a9d8fe469bc8e1e7006799f..d0c984398e57a6075fa3f0027dbad1fff4a32463 100644 (file)
@@ -84,7 +84,7 @@ sp_handle_detach(sp_handle_object* self, PyObject* args)
 
        handle = self->handle;
 
-       self->handle = NULL;
+       self->handle = INVALID_HANDLE_VALUE;
 
        /* note: return the current handle, as an integer */
        return HANDLE_TO_PYNUM(handle);