From mboxrd@z Thu Jan 1 00:00:00 1970 Date: Wed, 8 Jan 2020 15:24:22 -0500 From: Vivek Goyal Message-ID: <20200108202422.GF1995@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Subject: [Virtio-fs] [PATCH] virtiofsd: Open fd O_RDONLY in setxattr/removexattr List-Id: Development discussions about virtio-fs List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: virtio-fs-list Do not open fd O_RDWR as it will fail for directories with EISDIR. This code can be called both for regular files as well as directories. I noticed this when I tried "setfattr -n user.foo -v test " inside the guest and got EISDIR. To write xattr, we don't have to open fd with write permissions. Looks like kernel will do permission checks on inode. Signed-off-by: Vivek Goyal --- contrib/virtiofsd/passthrough_ll.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) Index: qemu/contrib/virtiofsd/passthrough_ll.c =================================================================== --- qemu.orig/contrib/virtiofsd/passthrough_ll.c 2020-01-08 15:01:03.821980889 -0500 +++ qemu/contrib/virtiofsd/passthrough_ll.c 2020-01-08 15:05:15.209384352 -0500 @@ -2424,7 +2424,7 @@ static void lo_setxattr(fuse_req_t req, } sprintf(procname, "%i", inode->fd); - fd = openat(lo->proc_self_fd, procname, O_RDWR); + fd = openat(lo->proc_self_fd, procname, O_RDONLY); if (fd < 0) { saverr = errno; goto out; @@ -2473,7 +2473,7 @@ static void lo_removexattr(fuse_req_t re } sprintf(procname, "%i", inode->fd); - fd = openat(lo->proc_self_fd, procname, O_RDWR); + fd = openat(lo->proc_self_fd, procname, O_RDONLY); if (fd < 0) { saverr = errno; goto out;