forked from Minki/linux
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: Jeff Layton <jlayton@kernel.org> Reviewed-by: "Yan, Zheng" <zyan@redhat.com> Acked-by: Ilya Dryomov <idryomov@gmail.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
parent
f1d1b51dea
commit
3b421018f4
@ -63,7 +63,7 @@ static ssize_t ceph_vxattrcb_layout(struct ceph_inode_info *ci, char *val,
|
||||
const char *ns_field = " pool_namespace=";
|
||||
char buf[128];
|
||||
size_t len, total_len = 0;
|
||||
int ret;
|
||||
ssize_t ret;
|
||||
|
||||
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,
|
||||
if (pool_ns)
|
||||
total_len += strlen(ns_field) + pool_ns->len;
|
||||
|
||||
if (!size) {
|
||||
ret = total_len;
|
||||
} else if (total_len > size) {
|
||||
ret = -ERANGE;
|
||||
} else {
|
||||
ret = total_len;
|
||||
if (size >= total_len) {
|
||||
memcpy(val, buf, len);
|
||||
ret = len;
|
||||
if (pool_name) {
|
||||
@ -803,8 +800,11 @@ ssize_t __ceph_getxattr(struct inode *inode, const char *name, void *value,
|
||||
if (err)
|
||||
return err;
|
||||
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);
|
||||
if (size && size < err)
|
||||
err = -ERANGE;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user