rbd: check for overflow in rbd_get_num_segments()
authorAlex Elder <elder@inktank.com>
Thu, 10 Jan 2013 18:56:58 +0000 (12:56 -0600)
committerAlex Elder <elder@inktank.com>
Fri, 25 Jan 2013 23:33:14 +0000 (17:33 -0600)
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>
drivers/block/rbd.c

index 4ed074138f8da24016d900ed591b0d25365b4cce..58d01e3a0fcea715e0c1bff0f7567834661f187d 100644 (file)
@@ -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;
 }
 
 /*