#5179: don't leak PIPE fds when child execution fails.

This commit is contained in:
Georg Brandl 2009-02-14 17:01:36 +00:00
parent 95777bb019
commit f3715d2fc7
2 changed files with 19 additions and 0 deletions

View File

@ -1151,6 +1151,9 @@ class Popen(object):
if data != "": if data != "":
os.waitpid(self.pid, 0) os.waitpid(self.pid, 0)
child_exception = pickle.loads(data) child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None:
os.close(fd)
raise child_exception raise child_exception

View File

@ -520,6 +520,22 @@ class ProcessTestCase(unittest.TestCase):
else: else:
self.fail("Expected TypeError") self.fail("Expected TypeError")
def test_leaking_fds_on_error(self):
# see bug #5179: Popen leaks file descriptors to PIPEs if
# the child fails to execute; this will eventually exhaust
# the maximum number of open fds. 1024 seems a very common
# value for that limit, but Windows has 2048, so we loop
# 1024 times (each call leaked two fds).
for i in range(1024):
try:
subprocess.Popen(['nonexisting_i_hope'],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
# Windows raises IOError
except (IOError, OSError), err:
if err.errno != 2: # ignore "no such file"
raise
# #
# POSIX tests # POSIX tests
# #