diff options
author | Razvan-Adrian Ciochina <razvan.ciochina@gmail.com> | 2024-03-25 01:45:47 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-25 07:45:47 +0800 |
commit | 02d00cf3eed6681c6dde40585551c8243d7c003f (patch) | |
tree | 8c929d251a6d8935fb7c2b7e305b6f8986ba3178 /src | |
parent | 665d5d39691dda3592b4044c55f22c68b07d10c3 (diff) | |
download | rneovim-02d00cf3eed6681c6dde40585551c8243d7c003f.tar.gz rneovim-02d00cf3eed6681c6dde40585551c8243d7c003f.tar.bz2 rneovim-02d00cf3eed6681c6dde40585551c8243d7c003f.zip |
fix(backup): E1509 when writing extended attr to symlink (#28014)
Problem: E1509 when writing extended attributes to a symlink.
Solution: Copy the file before copying extended attributes.
On Fedora, the attribute being set is "security.selinux". For normal,
non-symlink files this attribute doesn't show up and that's why calling
os_copy_xattr() doesn't break in that case.
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/bufwrite.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/src/nvim/bufwrite.c b/src/nvim/bufwrite.c index 94a6604fc1..15f30b84bf 100644 --- a/src/nvim/bufwrite.c +++ b/src/nvim/bufwrite.c @@ -900,6 +900,14 @@ static int buf_write_make_backup(char *fname, bool append, FileInfo *file_info_o // remove old backup, if present os_remove(*backupp); + // copy the file + if (os_copy(fname, *backupp, UV_FS_COPYFILE_FICLONE) != 0) { + *err = set_err(_("E509: Cannot create backup file (add ! to override)")); + XFREE_CLEAR(*backupp); + *backupp = NULL; + continue; + } + // set file protection same as original file, but // strip s-bit. os_setperm(*backupp, perm & 0777); @@ -914,20 +922,11 @@ static int buf_write_make_backup(char *fname, bool append, FileInfo *file_info_o && os_chown(*backupp, (uv_uid_t)-1, (uv_gid_t)file_info_old->stat.st_gid) != 0) { os_setperm(*backupp, (perm & 0707) | ((perm & 07) << 3)); } + # ifdef HAVE_XATTR os_copy_xattr(fname, *backupp); # endif -#endif - // copy the file - if (os_copy(fname, *backupp, UV_FS_COPYFILE_FICLONE) != 0) { - *err = set_err(_("E509: Cannot create backup file (add ! to override)")); - XFREE_CLEAR(*backupp); - *backupp = NULL; - continue; - } - -#ifdef UNIX os_file_settime(*backupp, (double)file_info_old->stat.st_atim.tv_sec, (double)file_info_old->stat.st_mtim.tv_sec); |