mirror of
https://github.com/python/cpython.git
synced 2025-08-16 06:40:56 +00:00
[3.11] bpo-43153: Don't mask PermissionError
with NotADirectoryError
during tempdirectory cleanup (GH-29940) (GH-112754)
(cherry picked from commit 8cdfee1bb9
)
Co-authored-by: Ken Jin <kenjin@python.org>
Co-authored-by: andrei kulakov <andrei.avk@gmail.com>
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
parent
80c314c9ce
commit
23920a0843
3 changed files with 41 additions and 2 deletions
|
@ -41,6 +41,7 @@ import warnings as _warnings
|
|||
import io as _io
|
||||
import os as _os
|
||||
import shutil as _shutil
|
||||
import stat as _stat
|
||||
import errno as _errno
|
||||
from random import Random as _Random
|
||||
import sys as _sys
|
||||
|
@ -876,8 +877,31 @@ class TemporaryDirectory:
|
|||
|
||||
try:
|
||||
_os.unlink(path)
|
||||
# PermissionError is raised on FreeBSD for directories
|
||||
except (IsADirectoryError, PermissionError):
|
||||
except IsADirectoryError:
|
||||
cls._rmtree(path, ignore_errors=ignore_errors)
|
||||
except PermissionError:
|
||||
# The PermissionError handler was originally added for
|
||||
# FreeBSD in directories, but it seems that it is raised
|
||||
# on Windows too.
|
||||
# bpo-43153: Calling _rmtree again may
|
||||
# raise NotADirectoryError and mask the PermissionError.
|
||||
# So we must re-raise the current PermissionError if
|
||||
# path is not a directory.
|
||||
try:
|
||||
st = _os.lstat(path)
|
||||
except OSError:
|
||||
if ignore_errors:
|
||||
return
|
||||
raise
|
||||
if (_stat.S_ISLNK(st.st_mode) or
|
||||
not _stat.S_ISDIR(st.st_mode) or
|
||||
(hasattr(st, 'st_file_attributes') and
|
||||
st.st_file_attributes & _stat.FILE_ATTRIBUTE_REPARSE_POINT and
|
||||
st.st_reparse_tag == _stat.IO_REPARSE_TAG_MOUNT_POINT)
|
||||
):
|
||||
if ignore_errors:
|
||||
return
|
||||
raise
|
||||
cls._rmtree(path, ignore_errors=ignore_errors)
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue