From f6b361ec1a10b93ff8b927b400ca1777429bb23a Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 13 Feb 2013 00:35:30 +0200 Subject: Issue #16800: tempfile.gettempdir() no longer left temporary files when the disk is full. Original patch by Amir Szekely. --- Lib/tempfile.py | 13 ++++++++----- Lib/test/test_tempfile.py | 46 ++++++++++++++++++++++++++++++++++++++++++++-- Misc/ACKS | 1 + Misc/NEWS | 3 +++ 4 files changed, 56 insertions(+), 7 deletions(-) diff --git a/Lib/tempfile.py b/Lib/tempfile.py index ae35314..0dbd889 100644 --- a/Lib/tempfile.py +++ b/Lib/tempfile.py @@ -175,11 +175,14 @@ def _get_default_tempdir(): filename = _os.path.join(dir, name) try: fd = _os.open(filename, _bin_openflags, 0o600) - fp = _io.open(fd, 'wb') - fp.write(b'blat') - fp.close() - _os.unlink(filename) - del fp, fd + try: + try: + fp = _io.open(fd, 'wb', buffering=0, closefd=False) + fp.write(b'blat') + finally: + _os.close(fd) + finally: + _os.unlink(filename) return dir except (OSError, IOError) as e: if e.args[0] != _errno.EEXIST: diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index a90cd0e..cf8b35a 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -1,5 +1,7 @@ # tempfile.py unit tests. import tempfile +import errno +import io import os import signal import sys @@ -211,8 +213,48 @@ class test__candidate_tempdir_list(TC): test_classes.append(test__candidate_tempdir_list) - -# We test _get_default_tempdir by testing gettempdir. +# We test _get_default_tempdir some more by testing gettempdir. + +class TestGetDefaultTempdir(TC): + """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(-1) + + with support.swap_attr(io, "open", raise_OSError): + # test again with failing io.open() + with self.assertRaises(IOError) as cm: + tempfile._get_default_tempdir() + self.assertEqual(cm.exception.args[0], errno.ENOENT) + 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(IOError) as cm: + tempfile._get_default_tempdir() + self.assertEqual(cm.exception.errno, errno.ENOENT) + self.assertEqual(os.listdir(our_temp_directory), []) + +test_classes.append(TestGetDefaultTempdir) class test__get_candidate_names(TC): diff --git a/Misc/ACKS b/Misc/ACKS index 7ed6b31..1ea66e4 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1051,6 +1051,7 @@ Andrew Svetlov Paul Swartz Thenault Sylvain Péter Szabó +Amir Szekely Arfrever Frehtes Taifersar Arahesis Neil Tallim Geoff Talvola diff --git a/Misc/NEWS b/Misc/NEWS index a341bf4..4b22d9b 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -221,6 +221,9 @@ Core and Builtins 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 email.encoders.encode_7or8bit when used with binary data. -- cgit v0.12