Issue #6274. Fixed a potential FD leak in subprocess.py.

This commit is contained in:
Facundo Batista 2009-06-19 19:51:26 +00:00
parent 7731bedca2
commit 07638b9085
2 changed files with 82 additions and 72 deletions

View file

@ -999,6 +999,8 @@ class Popen(object):
# The first char specifies the exception type: 0 means # The first char specifies the exception type: 0 means
# OSError, 1 means some other error. # OSError, 1 means some other error.
errpipe_read, errpipe_write = os.pipe() errpipe_read, errpipe_write = os.pipe()
try:
try:
self._set_cloexec_flag(errpipe_write) self._set_cloexec_flag(errpipe_write)
gc_was_enabled = gc.isenabled() gc_was_enabled = gc.isenabled()
@ -1072,7 +1074,10 @@ class Popen(object):
# Parent # Parent
if gc_was_enabled: if gc_was_enabled:
gc.enable() gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write) os.close(errpipe_write)
if p2cread is not None and p2cwrite is not None: if p2cread is not None and p2cwrite is not None:
os.close(p2cread) os.close(p2cread)
if c2pwrite is not None and c2pread is not None: if c2pwrite is not None and c2pread is not None:
@ -1082,7 +1087,10 @@ class Popen(object):
# Wait for exec to fail or succeed; possibly raising exception # Wait for exec to fail or succeed; possibly raising exception
data = os.read(errpipe_read, 1048576) # Exceptions limited to 1 MB data = os.read(errpipe_read, 1048576) # Exceptions limited to 1 MB
finally:
# be sure the FD is closed no matter what
os.close(errpipe_read) os.close(errpipe_read)
if data != "": if data != "":
os.waitpid(self.pid, 0) os.waitpid(self.pid, 0)
child_exception = pickle.loads(data) child_exception = pickle.loads(data)

View file

@ -56,6 +56,8 @@ Core and Builtins
Library Library
------- -------
- Issue #6274: Fixed possible file descriptors leak in subprocess.py
- Issue #6271: mmap tried to close invalid file handle (-1) when annonymous. - Issue #6271: mmap tried to close invalid file handle (-1) when annonymous.
(On Unix) (On Unix)