./configure (optional if already run)
make
-diff --git a/flist.c b/flist.c
-index 09b4fc5..a948194 100644
---- a/flist.c
-+++ b/flist.c
-@@ -1466,6 +1466,7 @@ static struct file_struct *send_file_name(int f, struct file_list *flist,
- #endif
- #ifdef SUPPORT_XATTRS
- if (preserve_xattrs) {
-+ sx.st.st_mode = file->mode;
- if (get_xattr(fname, &sx) < 0) {
- io_error |= IOERR_GENERAL;
- return NULL;
-diff --git a/xattrs.c b/xattrs.c
-index 2d0e050..3c70d8a 100644
---- a/xattrs.c
-+++ b/xattrs.c
-@@ -282,6 +282,10 @@ int get_xattr(const char *fname, stat_x *sxp)
- {
- sxp->xattr = new(item_list);
- *sxp->xattr = empty_xattr;
-+
-+ if (IS_SPECIAL(sxp->st.st_mode) || IS_DEVICE(sxp->st.st_mode))
-+ return 0;
-+
- if (rsync_xal_get(fname, sxp->xattr) < 0) {
- free_xattr(sxp);
- return -1;
-@@ -865,6 +869,11 @@ int set_xattr(const char *fname, const struct file_struct *file,
- return -1;
- }
-
-+ if (IS_SPECIAL(sxp->st.st_mode) || IS_DEVICE(sxp->st.st_mode)) {
-+ errno = ENOTSUP;
-+ return -1;
-+ }
-+
- ndx = F_XATTR(file);
- return rsync_xal_set(fname, lst + ndx, fnamecmp, sxp);
- }
+based-on: a01e3b490eb36ccf9e704840e1b6683dab867550