Commit 3b421018 authored by Jeff Layton's avatar Jeff Layton Committed by Ilya Dryomov

ceph: return -ERANGE if virtual xattr value didn't fit in buffer

The getxattr manpage states that we should return ERANGE if the
destination buffer size is too small to hold the value.
ceph_vxattrcb_layout does this internally, but we should be doing
this for all vxattrs.

Fix the only caller of getxattr_cb to check the returned size
against the buffer length and return -ERANGE if it doesn't fit.
Drop the same check in ceph_vxattrcb_layout and just rely on the
caller to handle it.
Signed-off-by: default avatarJeff Layton <jlayton@kernel.org>
Reviewed-by: default avatar"Yan, Zheng" <zyan@redhat.com>
Acked-by: default avatarIlya Dryomov <idryomov@gmail.com>
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent f1d1b51d
...@@ -63,7 +63,7 @@ static ssize_t ceph_vxattrcb_layout(struct ceph_inode_info *ci, char *val, ...@@ -63,7 +63,7 @@ static ssize_t ceph_vxattrcb_layout(struct ceph_inode_info *ci, char *val,
const char *ns_field = " pool_namespace="; const char *ns_field = " pool_namespace=";
char buf[128]; char buf[128];
size_t len, total_len = 0; size_t len, total_len = 0;
int ret; ssize_t ret;
pool_ns = ceph_try_get_string(ci->i_layout.pool_ns); pool_ns = ceph_try_get_string(ci->i_layout.pool_ns);
...@@ -87,11 +87,8 @@ static ssize_t ceph_vxattrcb_layout(struct ceph_inode_info *ci, char *val, ...@@ -87,11 +87,8 @@ static ssize_t ceph_vxattrcb_layout(struct ceph_inode_info *ci, char *val,
if (pool_ns) if (pool_ns)
total_len += strlen(ns_field) + pool_ns->len; total_len += strlen(ns_field) + pool_ns->len;
if (!size) { ret = total_len;
ret = total_len; if (size >= total_len) {
} else if (total_len > size) {
ret = -ERANGE;
} else {
memcpy(val, buf, len); memcpy(val, buf, len);
ret = len; ret = len;
if (pool_name) { if (pool_name) {
...@@ -803,8 +800,11 @@ ssize_t __ceph_getxattr(struct inode *inode, const char *name, void *value, ...@@ -803,8 +800,11 @@ ssize_t __ceph_getxattr(struct inode *inode, const char *name, void *value,
if (err) if (err)
return err; return err;
err = -ENODATA; err = -ENODATA;
if (!(vxattr->exists_cb && !vxattr->exists_cb(ci))) if (!(vxattr->exists_cb && !vxattr->exists_cb(ci))) {
err = vxattr->getxattr_cb(ci, value, size); err = vxattr->getxattr_cb(ci, value, size);
if (size && size < err)
err = -ERANGE;
}
return err; return err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment