Issue 21058: tempfile.NamedTemporaryFile leaks file descriptor when fdopen fails (original) (raw)
The NamedTemporaryFile inside the standard tempfile library leaks an open file descriptor when fdopen fails.
Test case:
ulimit -SHn 50
python test1.py
from tempfile import NamedTemporaryFile
while 1: try: NamedTemporaryFile(mode='x') except ValueError as ex: pass
Output:
Traceback (most recent call last): File "./a2.py", line 7, in File "/usr/lib/python2.7/tempfile.py", line 454, in NamedTemporaryFile File "/usr/lib/python2.7/tempfile.py", line 235, in _mkstemp_inner OSError: [Errno 24] Too many open files: '/tmp/tmpI0MIEW' Error in sys.excepthook: Traceback (most recent call last): File "/usr/lib/python2.7/dist-packages/apport_python_hook.py", line 66, in apport_excepthook ImportError: No module named fileutils
Original exception was: Traceback (most recent call last): File "./a2.py", line 7, in File "/usr/lib/python2.7/tempfile.py", line 454, in NamedTemporaryFile File "/usr/lib/python2.7/tempfile.py", line 235, in _mkstemp_inner OSError: [Errno 24] Too many open files: '/tmp/tmpI0MIEW'
Patch:
@@ -452,7 +452,11 @@ flags |= _os.O_TEMPORARY
(fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
- file = _os.fdopen(fd, mode, bufsize)
- try:
file = _os.fdopen(fd, mode, bufsize)
- except Exception as ex:
_os.close(fd)
return _TemporaryFileWrapper(file, name, delete)raise
if _os.name != 'posix' or _os.sys.platform == 'cygwin':