mirror of https://github.com/python/cpython
#5179: don't leak PIPE fds when child execution fails.
This commit is contained in:
parent
95777bb019
commit
f3715d2fc7
|
@ -1151,6 +1151,9 @@ class Popen(object):
|
|||
if data != "":
|
||||
os.waitpid(self.pid, 0)
|
||||
child_exception = pickle.loads(data)
|
||||
for fd in (p2cwrite, c2pread, errread):
|
||||
if fd is not None:
|
||||
os.close(fd)
|
||||
raise child_exception
|
||||
|
||||
|
||||
|
|
|
@ -520,6 +520,22 @@ class ProcessTestCase(unittest.TestCase):
|
|||
else:
|
||||
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
|
||||
#
|
||||
|
|
Loading…
Reference in New Issue