From: Eli Bendersky Date: Fri, 6 Sep 2013 13:17:15 +0000 (-0700) Subject: Close #18849: Fixed a Windows-specific tempfile bug where collision with an X-Git-Tag: v2.7.6rc1~170 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8c7e925f6ea1333c7f2838a7643bbe39c6eff6af;p=thirdparty%2FPython%2Fcpython.git Close #18849: Fixed a Windows-specific tempfile bug where collision with an existing directory caused mkstemp and related APIs to fail instead of retrying. Report and fix by Vlad Shcherbina. --- diff --git a/Lib/tempfile.py b/Lib/tempfile.py index b5dce974e187..7154d2c6b521 100644 --- a/Lib/tempfile.py +++ b/Lib/tempfile.py @@ -242,6 +242,10 @@ def _mkstemp_inner(dir, pre, suf, flags): except OSError, e: if e.errno == _errno.EEXIST: continue # try again + if _os.name == 'nt' and e.errno == _errno.EACCES: + # On windows, when a directory with the chosen name already + # exists, EACCES error code is returned instead of EEXIST. + continue raise raise IOError, (_errno.EEXIST, "No usable temporary file name found") diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index b4d23addf2bb..eb3e2b9a6dd2 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -386,6 +386,32 @@ class test__mkstemp_inner(TC): self.do_create(bin=0).write("blat\n") # XXX should test that the file really is a text file + def test_collision_with_existing_directory(self): + # _mkstemp_inner tries another name when a directory with + # the chosen name already exists + container_dir = tempfile.mkdtemp() + try: + def mock_get_candidate_names(): + return iter(['aaa', 'aaa', 'bbb']) + with support.swap_attr(tempfile, + '_get_candidate_names', + mock_get_candidate_names): + dir = tempfile.mkdtemp(dir=container_dir) + self.assertTrue(dir.endswith('aaa')) + + flags = tempfile._bin_openflags + (fd, name) = tempfile._mkstemp_inner(container_dir, + tempfile.template, + '', + flags) + try: + self.assertTrue(name.endswith('bbb')) + finally: + os.close(fd) + os.unlink(name) + finally: + support.rmtree(container_dir) + test_classes.append(test__mkstemp_inner) diff --git a/Misc/ACKS b/Misc/ACKS index 8d29290a7094..e251596c988f 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -936,6 +936,7 @@ Aman Shah Ha Shao Mark Shannon Richard Shapiro +Vlad Shcherbina Justin Sheehy Charlie Shepherd Bruce Sherwood diff --git a/Misc/NEWS b/Misc/NEWS index 8c67ad1d3a13..53be4c14ffb1 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -156,6 +156,11 @@ Library - Issue #18113: Fixed a refcount leak in the curses.panel module's set_userptr() method. Reported by Atsuo Ishimoto. +- Issue #18849: Fixed a Windows-specific tempfile bug where collision with an + existing directory caused mkstemp and related APIs to fail instead of + retrying. Report and fix by Vlad Shcherbina. + + Tools/Demos -----------