Issue #16800: tempfile.gettempdir() no longer left temporary files when

the disk is full.  Original patch by Amir Szekely.
This commit is contained in:
Serhiy Storchaka 2013-02-13 00:37:29 +02:00
commit ff7fef9601
4 changed files with 51 additions and 6 deletions

View File

@ -172,11 +172,14 @@ def _get_default_tempdir():
filename = _os.path.join(dir, name) filename = _os.path.join(dir, name)
try: try:
fd = _os.open(filename, _bin_openflags, 0o600) fd = _os.open(filename, _bin_openflags, 0o600)
fp = _io.open(fd, 'wb') try:
fp.write(b'blat') try:
fp.close() fp = _io.open(fd, 'wb', buffering=0, closefd=False)
_os.unlink(filename) fp.write(b'blat')
del fp, fd finally:
_os.close(fd)
finally:
_os.unlink(filename)
return dir return dir
except FileExistsError: except FileExistsError:
pass pass

View File

@ -1,6 +1,7 @@
# tempfile.py unit tests. # tempfile.py unit tests.
import tempfile import tempfile
import errno import errno
import io
import os import os
import signal import signal
import sys import sys
@ -198,7 +199,44 @@ class TestCandidateTempdirList(BaseTestCase):
# paths in this list. # paths in this list.
# We test _get_default_tempdir by testing gettempdir. # We test _get_default_tempdir some more by testing gettempdir.
class TestGetDefaultTempdir(BaseTestCase):
"""Test _get_default_tempdir()."""
def test_no_files_left_behind(self):
# use a private empty directory
with tempfile.TemporaryDirectory() as our_temp_directory:
# force _get_default_tempdir() to consider our empty directory
def our_candidate_list():
return [our_temp_directory]
with support.swap_attr(tempfile, "_candidate_tempdir_list",
our_candidate_list):
# verify our directory is empty after _get_default_tempdir()
tempfile._get_default_tempdir()
self.assertEqual(os.listdir(our_temp_directory), [])
def raise_OSError(*args, **kwargs):
raise OSError()
with support.swap_attr(io, "open", raise_OSError):
# test again with failing io.open()
with self.assertRaises(FileNotFoundError):
tempfile._get_default_tempdir()
self.assertEqual(os.listdir(our_temp_directory), [])
open = io.open
def bad_writer(*args, **kwargs):
fp = open(*args, **kwargs)
fp.write = raise_OSError
return fp
with support.swap_attr(io, "open", bad_writer):
# test again with failing write()
with self.assertRaises(FileNotFoundError):
tempfile._get_default_tempdir()
self.assertEqual(os.listdir(our_temp_directory), [])
class TestGetCandidateNames(BaseTestCase): class TestGetCandidateNames(BaseTestCase):

View File

@ -1163,6 +1163,7 @@ Andrew Svetlov
Paul Swartz Paul Swartz
Thenault Sylvain Thenault Sylvain
Péter Szabó Péter Szabó
Amir Szekely
Arfrever Frehtes Taifersar Arahesis Arfrever Frehtes Taifersar Arahesis
Neil Tallim Neil Tallim
Geoff Talvola Geoff Talvola

View File

@ -175,6 +175,9 @@ Core and Builtins
Library Library
------- -------
- Issue #16800: tempfile.gettempdir() no longer left temporary files when
the disk is full. Original patch by Amir Szekely.
- Issue #16564: Fixed regression relative to Python2 in the operation of - Issue #16564: Fixed regression relative to Python2 in the operation of
email.encoders.encode_7or8bit when used with binary data. email.encoders.encode_7or8bit when used with binary data.