Commit 8c7e925f authored by Eli Bendersky's avatar Eli Bendersky

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.
parent fb03696f
......@@ -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")
......
......@@ -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)
......
......@@ -936,6 +936,7 @@ Aman Shah
Ha Shao
Mark Shannon
Richard Shapiro
Vlad Shcherbina
Justin Sheehy
Charlie Shepherd
Bruce Sherwood
......
......@@ -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
-----------
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment