mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Merged revisions 69620 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r69620 | georg.brandl | 2009-02-14 18:01:36 +0100 (Sa, 14 Feb 2009) | 1 line #5179: don't leak PIPE fds when child execution fails. ........
This commit is contained in:
parent
02bdf93b85
commit
78162daff6
2 changed files with 19 additions and 0 deletions
|
@ -1103,6 +1103,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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -486,6 +486,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
|
||||||
#
|
#
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue