diff options
author | Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp> | 2009-03-03 22:55:00 +0000 |
---|---|---|
committer | Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp> | 2009-03-03 22:55:00 +0000 |
commit | 857c00e0fd026433962a95d1f4551fcde88e601c (patch) | |
tree | 04965216c3d4edd1b0d408ebd7a78f326ea8ebed | |
parent | a97bed9572c9c13c33195c38d09a1d1f02ef8ad2 (diff) | |
download | cpython-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.py | 47 | ||||
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | PC/_subprocess.c | 2 |
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): @@ -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); |