mirror of
https://github.com/python/cpython.git
synced 2025-08-11 20:40:27 +00:00
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. ........
This commit is contained in:
parent
a97bed9572
commit
857c00e0fd
3 changed files with 18 additions and 33 deletions
|
@ -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):
|
||||||
|
|
||||||
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):
|
||||||
|
|
||||||
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):
|
||||||
|
|
||||||
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
|
||||||
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)
|
||||||
|
|
||||||
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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue