mirror of
https://github.com/python/cpython.git
synced 2025-08-15 22:30:42 +00:00
[3.11] gh-91133: tempfile.TemporaryDirectory: fix symlink bug in cleanup (GH-99930) (GH-112839)
(cherry picked from commit 81c16cd94e
)
Co-authored-by: Søren Løvborg <sorenl@unity3d.com>
This commit is contained in:
parent
666a484d29
commit
5585334d77
3 changed files with 125 additions and 15 deletions
|
@ -270,6 +270,22 @@ def _mkstemp_inner(dir, pre, suf, flags, output_type):
|
|||
raise FileExistsError(_errno.EEXIST,
|
||||
"No usable temporary file name found")
|
||||
|
||||
def _dont_follow_symlinks(func, path, *args):
|
||||
# Pass follow_symlinks=False, unless not supported on this platform.
|
||||
if func in _os.supports_follow_symlinks:
|
||||
func(path, *args, follow_symlinks=False)
|
||||
elif _os.name == 'nt' or not _os.path.islink(path):
|
||||
func(path, *args)
|
||||
|
||||
def _resetperms(path):
|
||||
try:
|
||||
chflags = _os.chflags
|
||||
except AttributeError:
|
||||
pass
|
||||
else:
|
||||
_dont_follow_symlinks(chflags, path, 0)
|
||||
_dont_follow_symlinks(_os.chmod, path, 0o700)
|
||||
|
||||
|
||||
# User visible interfaces.
|
||||
|
||||
|
@ -863,17 +879,10 @@ class TemporaryDirectory:
|
|||
def _rmtree(cls, name, ignore_errors=False):
|
||||
def onerror(func, path, exc_info):
|
||||
if issubclass(exc_info[0], PermissionError):
|
||||
def resetperms(path):
|
||||
try:
|
||||
_os.chflags(path, 0)
|
||||
except AttributeError:
|
||||
pass
|
||||
_os.chmod(path, 0o700)
|
||||
|
||||
try:
|
||||
if path != name:
|
||||
resetperms(_os.path.dirname(path))
|
||||
resetperms(path)
|
||||
_resetperms(_os.path.dirname(path))
|
||||
_resetperms(path)
|
||||
|
||||
try:
|
||||
_os.unlink(path)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue