From: TomasKorbar Date: Sun, 26 Sep 2021 23:34:15 +0000 (+0200) Subject: Eventually add write permission when setting extended attributes (#212) X-Git-Tag: v3.2.4pre1~69 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b2e16facd43ae035e916b6018a031a23bb54c8ed;p=thirdparty%2Frsync.git Eventually add write permission when setting extended attributes (#212) * Eventually add write permission when setting extended attributes When we need to set extended atributes of file which does not allow write then temporarily add write permission and after attributes are set, remove it again. Resolves #208 Co-authored-by: Wayne Davison --- diff --git a/xattrs.c b/xattrs.c index 508649c0..3c549192 100644 --- a/xattrs.c +++ b/xattrs.c @@ -1055,7 +1055,7 @@ int set_xattr(const char *fname, const struct file_struct *file, const char *fna { rsync_xa_list *glst = rsync_xal_l.items; item_list *lst; - int ndx; + int ndx, added_write_perm = 0; if (dry_run) return 1; /* FIXME: --dry-run needs to compute this value */ @@ -1084,10 +1084,23 @@ int set_xattr(const char *fname, const struct file_struct *file, const char *fna } #endif + /* If the target file lacks write permission, we try to add it + * temporarily so we can change the extended attributes. */ + if (!am_root +#ifdef SUPPORT_LINKS + && !S_ISLNK(sxp->st.st_mode) +#endif + && access(fname, W_OK) < 0 + && do_chmod(fname, (sxp->st.st_mode & CHMOD_BITS) | S_IWUSR) == 0) + added_write_perm = 1; + ndx = F_XATTR(file); glst += ndx; lst = &glst->xa_items; - return rsync_xal_set(fname, lst, fnamecmp, sxp); + int return_value = rsync_xal_set(fname, lst, fnamecmp, sxp); + if (added_write_perm) /* remove the temporary write permission */ + do_chmod(fname, sxp->st.st_mode); + return return_value; } #ifdef SUPPORT_ACLS