aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/dir.c
diff options
context:
space:
mode:
authorMiklos Szeredi <miklos@szeredi.hu>2004-03-31 10:19:18 +0000
committerMiklos Szeredi <miklos@szeredi.hu>2004-03-31 10:19:18 +0000
commit03cebaef615f9098d030ba776c124fa5f27d5c74 (patch)
treecf9f01b9200cbae03fd6d767ff4390f2738d5ec0 /kernel/dir.c
parent3ed84231ec6d4a66a5b20db355eb6e9585e9edc5 (diff)
downloadlibfuse-03cebaef615f9098d030ba776c124fa5f27d5c74.tar.gz
fix zero size case for getxattr and listxattr
Diffstat (limited to 'kernel/dir.c')
-rw-r--r--kernel/dir.c34
1 files changed, 24 insertions, 10 deletions
diff --git a/kernel/dir.c b/kernel/dir.c
index 34ab665..d5d79b1 100644
--- a/kernel/dir.c
+++ b/kernel/dir.c
@@ -751,7 +751,8 @@ static ssize_t fuse_getxattr(struct dentry *entry, const char *name,
struct fuse_conn *fc = INO_FC(inode);
struct fuse_in in = FUSE_IN_INIT;
struct fuse_out out = FUSE_OUT_INIT;
- struct fuse_getlistxattr_in inarg;
+ struct fuse_getxattr_in inarg;
+ struct fuse_getxattr_out outarg;
memset(&inarg, 0, sizeof(inarg));
inarg.size = size;
@@ -763,13 +764,19 @@ static ssize_t fuse_getxattr(struct dentry *entry, const char *name,
in.args[0].value = &inarg;
in.args[1].size = strlen(name) + 1;
in.args[1].value = name;
- out.argvar = 1;
+ /* This is really two different operations rolled into one */
out.numargs = 1;
- out.args[0].size = size;
- out.args[0].value = value;
+ if(size) {
+ out.argvar = 1;
+ out.args[0].size = size;
+ out.args[0].value = value;
+ } else {
+ out.args[0].size = sizeof(outarg);
+ out.args[0].value = &outarg;
+ }
request_send(fc, &in, &out);
if(!out.h.error)
- return out.args[0].size;
+ return size ? out.args[0].size : outarg.size;
else
return out.h.error;
}
@@ -780,7 +787,8 @@ static ssize_t fuse_listxattr(struct dentry *entry, char *list, size_t size)
struct fuse_conn *fc = INO_FC(inode);
struct fuse_in in = FUSE_IN_INIT;
struct fuse_out out = FUSE_OUT_INIT;
- struct fuse_getlistxattr_in inarg;
+ struct fuse_getxattr_in inarg;
+ struct fuse_getxattr_out outarg;
memset(&inarg, 0, sizeof(inarg));
inarg.size = size;
@@ -790,13 +798,19 @@ static ssize_t fuse_listxattr(struct dentry *entry, char *list, size_t size)
in.numargs = 1;
in.args[0].size = sizeof(inarg);
in.args[0].value = &inarg;
- out.argvar = 1;
+ /* This is really two different operations rolled into one */
out.numargs = 1;
- out.args[0].size = size;
- out.args[0].value = list;
+ if(size) {
+ out.argvar = 1;
+ out.args[0].size = size;
+ out.args[0].value = list;
+ } else {
+ out.args[0].size = sizeof(outarg);
+ out.args[0].value = &outarg;
+ }
request_send(fc, &in, &out);
if(!out.h.error)
- return out.args[0].size;
+ return size ? out.args[0].size : outarg.size;
else
return out.h.error;
}