Kaydet (Commit) 857c00e0 authored tarafından Hirokazu Yamamoto's avatar Hirokazu Yamamoto

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.
........
üst a97bed95
...@@ -594,21 +594,13 @@ class Popen(object): ...@@ -594,21 +594,13 @@ class Popen(object):
c2pread, c2pwrite, c2pread, c2pwrite,
errread, errwrite) 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 mswindows:
if stdin is None and p2cwrite is not None: if p2cwrite is not None:
os.close(p2cwrite) p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0)
p2cwrite = None if c2pread is not None:
if stdout is None and c2pread is not None: c2pread = msvcrt.open_osfhandle(c2pread.Detach(), 0)
os.close(c2pread) if errread is not None:
c2pread = None errread = msvcrt.open_osfhandle(errread.Detach(), 0)
if stderr is None and errread is not None:
os.close(errread)
errread = None
if p2cwrite is not None: if p2cwrite is not None:
self.stdin = os.fdopen(p2cwrite, 'wb', bufsize) self.stdin = os.fdopen(p2cwrite, 'wb', bufsize)
...@@ -692,13 +684,10 @@ class Popen(object): ...@@ -692,13 +684,10 @@ class Popen(object):
if stdin is None: if stdin is None:
p2cread = GetStdHandle(STD_INPUT_HANDLE) p2cread = GetStdHandle(STD_INPUT_HANDLE)
if p2cread is not None: if p2cread is None:
pass p2cread, _ = CreatePipe(None, 0)
elif stdin is None or stdin == PIPE: elif stdin == PIPE:
p2cread, p2cwrite = CreatePipe(None, 0) p2cread, p2cwrite = CreatePipe(None, 0)
# Detach and turn into fd
p2cwrite = p2cwrite.Detach()
p2cwrite = msvcrt.open_osfhandle(p2cwrite, 0)
elif isinstance(stdin, int): elif isinstance(stdin, int):
p2cread = msvcrt.get_osfhandle(stdin) p2cread = msvcrt.get_osfhandle(stdin)
else: else:
...@@ -708,13 +697,10 @@ class Popen(object): ...@@ -708,13 +697,10 @@ class Popen(object):
if stdout is None: if stdout is None:
c2pwrite = GetStdHandle(STD_OUTPUT_HANDLE) c2pwrite = GetStdHandle(STD_OUTPUT_HANDLE)
if c2pwrite is not None: if c2pwrite is None:
pass _, c2pwrite = CreatePipe(None, 0)
elif stdout is None or stdout == PIPE: elif stdout == PIPE:
c2pread, c2pwrite = CreatePipe(None, 0) c2pread, c2pwrite = CreatePipe(None, 0)
# Detach and turn into fd
c2pread = c2pread.Detach()
c2pread = msvcrt.open_osfhandle(c2pread, 0)
elif isinstance(stdout, int): elif isinstance(stdout, int):
c2pwrite = msvcrt.get_osfhandle(stdout) c2pwrite = msvcrt.get_osfhandle(stdout)
else: else:
...@@ -724,13 +710,10 @@ class Popen(object): ...@@ -724,13 +710,10 @@ class Popen(object):
if stderr is None: if stderr is None:
errwrite = GetStdHandle(STD_ERROR_HANDLE) errwrite = GetStdHandle(STD_ERROR_HANDLE)
if errwrite is not None: if errwrite is None:
pass _, errwrite = CreatePipe(None, 0)
elif stderr is None or stderr == PIPE: elif stderr == PIPE:
errread, errwrite = CreatePipe(None, 0) errread, errwrite = CreatePipe(None, 0)
# Detach and turn into fd
errread = errread.Detach()
errread = msvcrt.open_osfhandle(errread, 0)
elif stderr == STDOUT: elif stderr == STDOUT:
errwrite = c2pwrite errwrite = c2pwrite
elif isinstance(stderr, int): elif isinstance(stderr, int):
......
...@@ -89,6 +89,8 @@ Core and Builtins ...@@ -89,6 +89,8 @@ Core and Builtins
Library 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 - Issue #4308: httplib.IncompleteRead's repr doesn't include all of the data all
ready received. ready received.
......
...@@ -87,7 +87,7 @@ sp_handle_detach(sp_handle_object* self, PyObject* args) ...@@ -87,7 +87,7 @@ sp_handle_detach(sp_handle_object* self, PyObject* args)
handle = self->handle; handle = self->handle;
self->handle = NULL; self->handle = INVALID_HANDLE_VALUE;
/* note: return the current handle, as an integer */ /* note: return the current handle, as an integer */
return HANDLE_TO_PYNUM(handle); return HANDLE_TO_PYNUM(handle);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment