gh-79325: Fix recursion error in TemporaryDirectory cleanup on Windows (GH-112762)

This commit is contained in:
Serhiy Storchaka 2023-12-07 19:21:36 +02:00 committed by GitHub
parent ba18893555
commit b2923a61a1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 2 deletions

View file

@ -888,9 +888,14 @@ def __init__(self, suffix=None, prefix=None, dir=None,
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 @@ def onexc(func, path, exc):
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):

View file

@ -1651,6 +1651,17 @@ def test_explicit_cleanup_correct_error(self):
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):

View file

@ -0,0 +1,2 @@
Fix an infinite recursion error in :func:`tempfile.TemporaryDirectory`
cleanup on Windows.