diff -r 009dc81e8bc9 Lib/tempfile.py --- a/Lib/tempfile.py Tue Feb 05 11:34:39 2013 -0500 +++ b/Lib/tempfile.py Tue Feb 05 20:15:19 2013 +0200 @@ -172,15 +172,18 @@ name = next(namer) 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: + fd = _os.open(filename, _bin_openflags, 0o600) + except FileExistsError: + continue + try: + try: + _os.write(fd, b'blat') + finally: + _os.close(fd) + finally: + _os.unlink(filename) return dir - except FileExistsError: - pass except OSError: break # no point trying more names in this directory raise FileNotFoundError("No usable temporary directory found in %s" % dirlist) diff -r 009dc81e8bc9 Lib/test/test_tempfile.py --- a/Lib/test/test_tempfile.py Tue Feb 05 11:34:39 2013 -0500 +++ b/Lib/test/test_tempfile.py Tue Feb 05 20:15:19 2013 +0200 @@ -197,7 +197,38 @@ # 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(os, "open", raise_OSError): + # test again with failing os.open() + with self.assertRaises(FileNotFoundError): + tempfile._get_default_tempdir() + self.assertEqual(os.listdir(our_temp_directory), []) + + with support.swap_attr(os, "write", raise_OSError): + # test again with failing os.write() + with self.assertRaises(FileNotFoundError): + tempfile._get_default_tempdir() + self.assertEqual(os.listdir(our_temp_directory), []) class TestGetCandidateNames(BaseTestCase):