diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2004-03-31 10:19:18 +0000 |
---|---|---|
committer | Miklos Szeredi <miklos@szeredi.hu> | 2004-03-31 10:19:18 +0000 |
commit | 03cebaef615f9098d030ba776c124fa5f27d5c74 (patch) | |
tree | cf9f01b9200cbae03fd6d767ff4390f2738d5ec0 /kernel/dir.c | |
parent | 3ed84231ec6d4a66a5b20db355eb6e9585e9edc5 (diff) | |
download | libfuse-03cebaef615f9098d030ba776c124fa5f27d5c74.tar.gz |
fix zero size case for getxattr and listxattr
Diffstat (limited to 'kernel/dir.c')
-rw-r--r-- | kernel/dir.c | 34 |
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; } |