From d14427ad9eaeb0ec048dedebc7fa568a5b6a3aa2 Mon Sep 17 00:00:00 2001 From: Antonio SJ Musumeci Date: Tue, 6 Dec 2022 23:26:08 -0500 Subject: [PATCH] Fix reading of setxattr name --- libfuse/include/fuse_common.h | 1 + libfuse/lib/fuse.c | 6 +++++- libfuse/lib/fuse_lowlevel.c | 4 ++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/libfuse/include/fuse_common.h b/libfuse/include/fuse_common.h index 62089504..7d9a050e 100644 --- a/libfuse/include/fuse_common.h +++ b/libfuse/include/fuse_common.h @@ -126,6 +126,7 @@ struct fuse_file_info_t #define FUSE_CAP_POSIX_ACL (1 << 19) #define FUSE_CAP_CACHE_SYMLINKS (1 << 20) #define FUSE_CAP_MAX_PAGES (1 << 21) +#define FUSE_CAP_SETXATTR_EXT (1 << 22) /** * Ioctl flags diff --git a/libfuse/lib/fuse.c b/libfuse/lib/fuse.c index 713d508c..ee900198 100644 --- a/libfuse/lib/fuse.c +++ b/libfuse/lib/fuse.c @@ -2788,7 +2788,11 @@ fuse_lib_setxattr(fuse_req_t req, struct fuse_setxattr_in *arg; arg = fuse_hdr_arg(hdr_); - name = PARAM(arg); + if((req->f->conn.capable & FUSE_SETXATTR_EXT) && (req->f->conn.want & FUSE_SETXATTR_EXT)) + name = PARAM(arg); + else + name = (((char*)arg) + FUSE_COMPAT_SETXATTR_IN_SIZE); + value = (name + strlen(name) + 1); f = req_fuse_prepare(req); diff --git a/libfuse/lib/fuse_lowlevel.c b/libfuse/lib/fuse_lowlevel.c index eeb10465..c78e7dd9 100644 --- a/libfuse/lib/fuse_lowlevel.c +++ b/libfuse/lib/fuse_lowlevel.c @@ -1432,6 +1432,8 @@ do_init(fuse_req_t req, f->conn.capable |= FUSE_CAP_READDIR_PLUS; if (arg->flags & FUSE_READDIRPLUS_AUTO) f->conn.capable |= FUSE_CAP_READDIR_PLUS_AUTO; + if (arg->flags & FUSE_SETXATTR_EXT) + f->conn.capable |= FUSE_CAP_SETXATTR_EXT; } else { @@ -1519,6 +1521,8 @@ do_init(fuse_req_t req, outarg.flags |= FUSE_DO_READDIRPLUS; if (f->conn.want & FUSE_CAP_READDIR_PLUS_AUTO) outarg.flags |= FUSE_READDIRPLUS_AUTO; + if (f->conn.want & FUSE_CAP_SETXATTR_EXT) + outarg.flags |= FUSE_SETXATTR_EXT; outarg.max_readahead = f->conn.max_readahead; outarg.max_write = f->conn.max_write;