Avoid directory permission issues with --fake-super.
[rsync/rsync.git] / lib / sysxattrs.c
index 1512518..d55ee0c 100644 (file)
@@ -145,8 +145,8 @@ static ssize_t read_xattr(int attrfd, void *buf, size_t buflen)
                ret = -1;
        } else {
                size_t bufpos;
-               for (bufpos = 0; bufpos < buflen; ) {
-                       ssize_t cnt = read(attrfd, buf + bufpos, buflen - bufpos);
+               for (bufpos = 0; bufpos < sb.st_size; ) {
+                       ssize_t cnt = read(attrfd, buf + bufpos, sb.st_size - bufpos);
                        if (cnt <= 0) {
                                if (cnt < 0 && errno == EINTR)
                                        continue;
@@ -193,7 +193,7 @@ int sys_lsetxattr(const char *path, const char *name, const void *value, size_t
        size_t bufpos;
        mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP;
 
-       if ((attrfd = attropen(path, name, O_CREAT|O_WRONLY|O_NOFOLLOW, mode)) < 0)
+       if ((attrfd = attropen(path, name, O_CREAT|O_TRUNC|O_WRONLY, mode)) < 0)
                return -1;
 
        for (bufpos = 0; bufpos < size; ) {
@@ -217,7 +217,7 @@ int sys_lremovexattr(const char *path, const char *name)
        int attrdirfd;
        int ret;
 
-       if ((attrdirfd = attropen(path, ".", O_RDWR)) < 0)
+       if ((attrdirfd = attropen(path, ".", O_RDONLY)) < 0)
                return -1;
 
        ret = unlinkat(attrdirfd, name, 0);