[Python-checkins] cpython (merge 3.2 -> 3.3): Issue #16800: tempfile.gettempdir() no longer left temporary files when

serhiy.storchaka python-checkins at python.org
Tue Feb 12 23:42:29 CET 2013


http://hg.python.org/cpython/rev/6f432bb11b28
changeset:   82183:6f432bb11b28
branch:      3.3
parent:      82174:574410153e73
parent:      82182:377123f10820
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Wed Feb 13 00:37:29 2013 +0200
summary:
  Issue #16800: tempfile.gettempdir() no longer left temporary files when
the disk is full.  Original patch by Amir Szekely.

files:
  Lib/tempfile.py           |  13 +++++---
  Lib/test/test_tempfile.py |  40 ++++++++++++++++++++++++++-
  Misc/ACKS                 |   1 +
  Misc/NEWS                 |   3 ++
  4 files changed, 51 insertions(+), 6 deletions(-)


diff --git a/Lib/tempfile.py b/Lib/tempfile.py
--- a/Lib/tempfile.py
+++ b/Lib/tempfile.py
@@ -172,11 +172,14 @@
             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 FileExistsError:
                 pass
diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py
--- a/Lib/test/test_tempfile.py
+++ b/Lib/test/test_tempfile.py
@@ -1,6 +1,7 @@
 # tempfile.py unit tests.
 import tempfile
 import errno
+import io
 import os
 import signal
 import sys
@@ -198,7 +199,44 @@
             # 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):
diff --git a/Misc/ACKS b/Misc/ACKS
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -1163,6 +1163,7 @@
 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
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -175,6 +175,9 @@
 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.
 

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list