summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2013-01-10 12:56:58 -0600
committerAlex Elder <elder@inktank.com>2013-01-25 17:33:14 -0600
commit38901e0f240b634467fb31743365af80a006be33 (patch)
treed69c8ed51d926b9bc79b2e7a6c078be3d79cb55f
parent98571b5aa776d4a69eadd7d4e5c9d4e69365ab9a (diff)
downloadlinux-3.10-38901e0f240b634467fb31743365af80a006be33.tar.gz
linux-3.10-38901e0f240b634467fb31743365af80a006be33.tar.bz2
linux-3.10-38901e0f240b634467fb31743365af80a006be33.zip
rbd: check for overflow in rbd_get_num_segments()
The return type of rbd_get_num_segments() is int, but the values it operates on are u64. Although it's not likely, there's no guarantee the result won't exceed what can be respresented in an int. The function is already designed to return -ERANGE on error, so just add this possible overflow as another reason to return that. Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Dan Mick <dan.mick@inktank.com> Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
-rw-r--r--drivers/block/rbd.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 4ed074138f8..58d01e3a0fc 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -820,6 +820,7 @@ static int rbd_get_num_segments(struct rbd_image_header *header,
{
u64 start_seg;
u64 end_seg;
+ u64 result;
if (!len)
return 0;
@@ -829,7 +830,11 @@ static int rbd_get_num_segments(struct rbd_image_header *header,
start_seg = ofs >> header->obj_order;
end_seg = (ofs + len - 1) >> header->obj_order;
- return end_seg - start_seg + 1;
+ result = end_seg - start_seg + 1;
+ if (result > (u64) INT_MAX)
+ return -ERANGE;
+
+ return (int) result;
}
/*