]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
blkdiscard: fix underflow when offset is greater than device size
authorRaphael S. Carvalho <raphaelsc@cloudius-systems.com>
Thu, 9 Oct 2014 00:46:07 +0000 (21:46 -0300)
committerKarel Zak <kzak@redhat.com>
Tue, 14 Oct 2014 10:04:14 +0000 (12:04 +0200)
If offset (range[0]) is greater than device size (blksize), the variable 'end'
will be greater than blksize, and range[1] (length) will be recalculated.
The underflow happens when subtracting range[0] (offset) from blksize, thus
range[1] will be the result of an underflow. The bug leads to unwanted behavior
from the program, where range[1] is likely to be a high number and then will
discard a considerable amount of blocks from the device. The fix consists of
exitting the program with an error message when the condition stated above is
true. Spotted while auditing the code.

Signed-off-by: Raphael S. Carvalho <raphaelsc@cloudius-systems.com>
sys-utils/blkdiscard.c

index 2ddcdb1b469e6704dc7893b16382ea6d1927f1f7..2f22af7249c37b0ccdb66fd4924951a2f751c44e 100644 (file)
@@ -149,6 +149,8 @@ int main(int argc, char **argv)
        range[1] &= ~(secsize - 1);
 
        /* is the range end behind the end of the device ?*/
+       if (range[0] > blksize)
+               err(EXIT_FAILURE, _("%s: offset is greater than device size"), path);
        end = range[0] + range[1];
        if (end < range[0] || end > blksize)
                range[1] = blksize - range[0];