summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/tempfile.py10
-rw-r--r--Lib/test/test_tempfile.py11
-rw-r--r--Misc/NEWS.d/next/Library/2023-12-05-18-57-53.gh-issue-79325.P2vMVK.rst2
3 files changed, 21 insertions, 2 deletions
diff --git a/Lib/tempfile.py b/Lib/tempfile.py
index 4d99f91..cbfc172 100644
--- a/Lib/tempfile.py
+++ b/Lib/tempfile.py
@@ -888,9 +888,14 @@ class TemporaryDirectory:
ignore_errors=self._ignore_cleanup_errors, delete=self._delete)
@classmethod
- def _rmtree(cls, name, ignore_errors=False):
+ def _rmtree(cls, name, ignore_errors=False, repeated=False):
def onexc(func, path, exc):
if isinstance(exc, PermissionError):
+ if repeated and path == name:
+ if ignore_errors:
+ return
+ raise
+
try:
if path != name:
_resetperms(_os.path.dirname(path))
@@ -912,7 +917,8 @@ class TemporaryDirectory:
if ignore_errors:
return
raise
- cls._rmtree(path, ignore_errors=ignore_errors)
+ cls._rmtree(path, ignore_errors=ignore_errors,
+ repeated=(path == name))
except FileNotFoundError:
pass
elif isinstance(exc, FileNotFoundError):
diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py
index 2729bec..b64b6a4 100644
--- a/Lib/test/test_tempfile.py
+++ b/Lib/test/test_tempfile.py
@@ -1651,6 +1651,17 @@ class TestTemporaryDirectory(BaseTestCase):
with self.assertRaises(PermissionError):
temp_dir.cleanup()
+ @unittest.skipUnless(os.name == "nt", "Only on Windows.")
+ def test_cleanup_with_used_directory(self):
+ with tempfile.TemporaryDirectory() as working_dir:
+ temp_dir = self.do_create(dir=working_dir)
+ subdir = os.path.join(temp_dir.name, "subdir")
+ os.mkdir(subdir)
+ with os_helper.change_cwd(subdir):
+ # Previously raised RecursionError on some OSes
+ # (e.g. Windows). See bpo-35144.
+ with self.assertRaises(PermissionError):
+ temp_dir.cleanup()
@os_helper.skip_unless_symlink
def test_cleanup_with_symlink_to_a_directory(self):
diff --git a/Misc/NEWS.d/next/Library/2023-12-05-18-57-53.gh-issue-79325.P2vMVK.rst b/Misc/NEWS.d/next/Library/2023-12-05-18-57-53.gh-issue-79325.P2vMVK.rst
new file mode 100644
index 0000000..f3c32d2
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-12-05-18-57-53.gh-issue-79325.P2vMVK.rst
@@ -0,0 +1,2 @@
+Fix an infinite recursion error in :func:`tempfile.TemporaryDirectory`
+cleanup on Windows.