mirror of
https://github.com/python/cpython.git
synced 2025-08-27 12:16:04 +00:00
bpo-24538: Fix bug in shutil involving the copying of xattrs to read-only files. (PR-13212)
Extended attributes can only be set on user-writeable files, but shutil previously first chmod()ed the destination file to the source's permissions and then tried to copy xattrs. This will cause failures if attempting to copy read-only files with xattrs, as occurs with Git clones on Lustre FS.
This commit is contained in:
parent
948ed8c96b
commit
79efbb7193
4 changed files with 15 additions and 1 deletions
|
@ -359,6 +359,9 @@ def copystat(src, dst, *, follow_symlinks=True):
|
|||
mode = stat.S_IMODE(st.st_mode)
|
||||
lookup("utime")(dst, ns=(st.st_atime_ns, st.st_mtime_ns),
|
||||
follow_symlinks=follow)
|
||||
# We must copy extended attributes before the file is (potentially)
|
||||
# chmod()'ed read-only, otherwise setxattr() will error with -EACCES.
|
||||
_copyxattr(src, dst, follow_symlinks=follow)
|
||||
try:
|
||||
lookup("chmod")(dst, mode, follow_symlinks=follow)
|
||||
except NotImplementedError:
|
||||
|
@ -382,7 +385,6 @@ def copystat(src, dst, *, follow_symlinks=True):
|
|||
break
|
||||
else:
|
||||
raise
|
||||
_copyxattr(src, dst, follow_symlinks=follow)
|
||||
|
||||
def copy(src, dst, *, follow_symlinks=True):
|
||||
"""Copy data and mode bits ("cp src dst"). Return the file's destination.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue