Issue #21058: Fix a leak of file descriptor in tempfile.NamedTemporaryFile(),
close the file descriptor if io.open() fails
This commit is contained in:
parent
93569c2b3d
commit
1f99f9d5c2
|
@ -458,10 +458,14 @@ def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
|
|||
flags |= _os.O_TEMPORARY
|
||||
|
||||
(fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
|
||||
file = _io.open(fd, mode, buffering=buffering,
|
||||
newline=newline, encoding=encoding)
|
||||
try:
|
||||
file = _io.open(fd, mode, buffering=buffering,
|
||||
newline=newline, encoding=encoding)
|
||||
|
||||
return _TemporaryFileWrapper(file, name, delete)
|
||||
return _TemporaryFileWrapper(file, name, delete)
|
||||
except Exception:
|
||||
_os.close(fd)
|
||||
raise
|
||||
|
||||
if _os.name != 'posix' or _os.sys.platform == 'cygwin':
|
||||
# On non-POSIX and Cygwin systems, assume that we cannot unlink a file
|
||||
|
|
|
@ -9,6 +9,7 @@ import re
|
|||
import warnings
|
||||
import contextlib
|
||||
import weakref
|
||||
from unittest import mock
|
||||
|
||||
import unittest
|
||||
from test import support, script_helper
|
||||
|
@ -758,6 +759,17 @@ class TestNamedTemporaryFile(BaseTestCase):
|
|||
pass
|
||||
self.assertRaises(ValueError, use_closed)
|
||||
|
||||
def test_no_leak_fd(self):
|
||||
# Issue #21058: don't leak file descriptor when io.pen() fails
|
||||
closed = []
|
||||
def close(fd):
|
||||
closed.append(fd)
|
||||
|
||||
with mock.patch('os.close', side_effect=close):
|
||||
with mock.patch('io.open', side_effect=ValueError):
|
||||
self.assertRaises(ValueError, tempfile.NamedTemporaryFile)
|
||||
self.assertEqual(len(closed), 1)
|
||||
|
||||
# How to test the mode and bufsize parameters?
|
||||
|
||||
|
||||
|
@ -1061,6 +1073,18 @@ if tempfile.NamedTemporaryFile is not tempfile.TemporaryFile:
|
|||
roundtrip("\u039B", "w+", encoding="utf-16")
|
||||
roundtrip("foo\r\n", "w+", newline="")
|
||||
|
||||
def test_no_leak_fd(self):
|
||||
# Issue #21058: don't leak file descriptor when io.open() fails
|
||||
closed = []
|
||||
def close(fd):
|
||||
closed.append(fd)
|
||||
|
||||
with mock.patch('os.close', side_effect=close):
|
||||
with mock.patch('io.open', side_effect=ValueError):
|
||||
self.assertRaises(ValueError, tempfile.TemporaryFile)
|
||||
self.assertEqual(len(closed), 1)
|
||||
|
||||
|
||||
|
||||
# Helper for test_del_on_shutdown
|
||||
class NulledModules:
|
||||
|
|
|
@ -24,6 +24,10 @@ Core and Builtins
|
|||
Library
|
||||
-------
|
||||
|
||||
- Issue #21058: Fix a leak of file descriptor in
|
||||
:func:`tempfile.NamedTemporaryFile`, close the file descriptor if
|
||||
:func:`io.open` fails
|
||||
|
||||
- Issue #21013: Enhance ssl.create_default_context() when used for server side
|
||||
sockets to provide better security by default.
|
||||
|
||||
|
|
Loading…
Reference in New Issue