rbd: fix response length parameter for encoded strings
rbd_dev_image_id() allocates space for length but passes a smaller value to rbd_obj_method_sync(). rbd_dev_v2_object_prefix() doesn't allocate space for length. Fix both to be consistent. Signed-off-by: Dongsheng Yang <dongsheng.yang@easystack.cn> Reviewed-by: Ilya Dryomov <idryomov@gmail.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
parent
b8fe918b09
commit
5435d20695
|
@ -5669,17 +5669,20 @@ static int rbd_dev_v2_image_size(struct rbd_device *rbd_dev)
|
||||||
|
|
||||||
static int rbd_dev_v2_object_prefix(struct rbd_device *rbd_dev)
|
static int rbd_dev_v2_object_prefix(struct rbd_device *rbd_dev)
|
||||||
{
|
{
|
||||||
|
size_t size;
|
||||||
void *reply_buf;
|
void *reply_buf;
|
||||||
int ret;
|
int ret;
|
||||||
void *p;
|
void *p;
|
||||||
|
|
||||||
reply_buf = kzalloc(RBD_OBJ_PREFIX_LEN_MAX, GFP_KERNEL);
|
/* Response will be an encoded string, which includes a length */
|
||||||
|
size = sizeof(__le32) + RBD_OBJ_PREFIX_LEN_MAX;
|
||||||
|
reply_buf = kzalloc(size, GFP_KERNEL);
|
||||||
if (!reply_buf)
|
if (!reply_buf)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
ret = rbd_obj_method_sync(rbd_dev, &rbd_dev->header_oid,
|
ret = rbd_obj_method_sync(rbd_dev, &rbd_dev->header_oid,
|
||||||
&rbd_dev->header_oloc, "get_object_prefix",
|
&rbd_dev->header_oloc, "get_object_prefix",
|
||||||
NULL, 0, reply_buf, RBD_OBJ_PREFIX_LEN_MAX);
|
NULL, 0, reply_buf, size);
|
||||||
dout("%s: rbd_obj_method_sync returned %d\n", __func__, ret);
|
dout("%s: rbd_obj_method_sync returned %d\n", __func__, ret);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -6696,7 +6699,6 @@ static int rbd_dev_image_id(struct rbd_device *rbd_dev)
|
||||||
dout("rbd id object name is %s\n", oid.name);
|
dout("rbd id object name is %s\n", oid.name);
|
||||||
|
|
||||||
/* Response will be an encoded string, which includes a length */
|
/* Response will be an encoded string, which includes a length */
|
||||||
|
|
||||||
size = sizeof (__le32) + RBD_IMAGE_ID_LEN_MAX;
|
size = sizeof (__le32) + RBD_IMAGE_ID_LEN_MAX;
|
||||||
response = kzalloc(size, GFP_NOIO);
|
response = kzalloc(size, GFP_NOIO);
|
||||||
if (!response) {
|
if (!response) {
|
||||||
|
@ -6708,7 +6710,7 @@ static int rbd_dev_image_id(struct rbd_device *rbd_dev)
|
||||||
|
|
||||||
ret = rbd_obj_method_sync(rbd_dev, &oid, &rbd_dev->header_oloc,
|
ret = rbd_obj_method_sync(rbd_dev, &oid, &rbd_dev->header_oloc,
|
||||||
"get_id", NULL, 0,
|
"get_id", NULL, 0,
|
||||||
response, RBD_IMAGE_ID_LEN_MAX);
|
response, size);
|
||||||
dout("%s: rbd_obj_method_sync returned %d\n", __func__, ret);
|
dout("%s: rbd_obj_method_sync returned %d\n", __func__, ret);
|
||||||
if (ret == -ENOENT) {
|
if (ret == -ENOENT) {
|
||||||
image_id = kstrdup("", GFP_KERNEL);
|
image_id = kstrdup("", GFP_KERNEL);
|
||||||
|
|
Loading…
Reference in New Issue