Skip to content

Commit

Permalink
Merged revisions 70137 via svnmerge from
Browse files Browse the repository at this point in the history
svn+ssh://[email protected]/python/trunk

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

  Issue python#5179: Fixed subprocess handle leak on failure on windows.
........
  • Loading branch information
Hirokazu Yamamoto committed Mar 3, 2009
1 parent 5b26fb5 commit 0c98817
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 33 deletions.
47 changes: 15 additions & 32 deletions Lib/subprocess.py
Original file line number Diff line number Diff line change
Expand Up @@ -638,21 +638,13 @@ def __init__(self, args, bufsize=0, executable=None,
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)
Expand Down Expand Up @@ -737,13 +729,10 @@ def _get_handles(self, stdin, stdout, stderr):

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:
Expand All @@ -753,13 +742,10 @@ def _get_handles(self, stdin, stdout, stderr):

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:
Expand All @@ -769,13 +755,10 @@ def _get_handles(self, stdin, stdout, stderr):

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):
Expand Down
2 changes: 2 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -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().
Expand Down
2 changes: 1 addition & 1 deletion PC/_subprocess.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 0c98817

Please sign in to comment.