mirror of
https://github.com/python/cpython
synced 2024-10-14 09:58:30 +00:00
gh-79325: Fix recursion error in TemporaryDirectory cleanup on Windows (GH-112762)
This commit is contained in:
parent
ba18893555
commit
b2923a61a1
|
@ -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):
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Fix an infinite recursion error in :func:`tempfile.TemporaryDirectory`
|
||||
cleanup on Windows.
|
Loading…
Reference in a new issue