summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>2009-03-03 22:55:00 +0000
committerHirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>2009-03-03 22:55:00 +0000
commit857c00e0fd026433962a95d1f4551fcde88e601c (patch)
tree04965216c3d4edd1b0d408ebd7a78f326ea8ebed
parenta97bed9572c9c13c33195c38d09a1d1f02ef8ad2 (diff)
downloadcpython-git-857c00e0fd026433962a95d1f4551fcde88e601c.tar.gz
Merged revisions 70137 via svnmerge from
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. ........
-rw-r--r--Lib/subprocess.py47
-rw-r--r--Misc/NEWS2
-rw-r--r--PC/_subprocess.c2
3 files changed, 18 insertions, 33 deletions
diff --git a/Lib/subprocess.py b/Lib/subprocess.py
index 29a3d59ff3..9eb192135c 100644
--- a/Lib/subprocess.py
+++ b/Lib/subprocess.py
@@ -594,21 +594,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 p2cwrite is not None:
self.stdin = os.fdopen(p2cwrite, 'wb', bufsize)
@@ -692,13 +684,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:
@@ -708,13 +697,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:
@@ -724,13 +710,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):
diff --git a/Misc/NEWS b/Misc/NEWS
index 6093fc275b..2338bf7a84 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -89,6 +89,8 @@ Core and Builtins
Library
-------
+- Issue #5179: Fixed subprocess handle leak on failure on windows.
+
- Issue #4308: httplib.IncompleteRead's repr doesn't include all of the data all
ready received.
diff --git a/PC/_subprocess.c b/PC/_subprocess.c
index f2c6b92090..bb240e107e 100644
--- a/PC/_subprocess.c
+++ b/PC/_subprocess.c
@@ -87,7 +87,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);