]> git.karo-electronics.de Git - karo-tx-linux.git/commit
loop: cleanup set_status interface
authorDmitry Monakhov <dmonakhov@openvz.org>
Tue, 8 Nov 2011 00:20:06 +0000 (11:20 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Fri, 11 Nov 2011 03:20:40 +0000 (14:20 +1100)
commitdcbc6cad6541a6cf642c46327c3ff071e57362aa
tree1ad7a0aa9cb3c157582db4ac5691e4382cadf085
parent3974ae5a3b889009326e0cb957dba29df63e46b2
loop: cleanup set_status interface

1) Anyone who has read access to loopdev has permission to call set_status
   and may change important parameters such as lo_offset, lo_sizelimit and
   so on, which contradicts to read access pattern and definitely equals
   to write access pattern.
2) Add lo_offset over i_size check to prevent blkdev_size overflow.
   ##Testcase_bagin
   #dd if=/dev/zero of=./file bs=1k count=1
   #losetup /dev/loop0 ./file
   /* userspace_application */
   struct loop_info64 loinf;
   fd = open("/dev/loop0", O_RDONLY);
   ioctl(fd, LOOP_GET_STATUS64, &loinf);
   /* Set offset to any value which is bigger than i_size, and sizelimit
    * to nonzero value*/
   loinf.lo_offset = 4096*1024;
   loinf.lo_sizelimit = 1024;
   ioctl(fd, LOOP_SET_STATUS64, &loinf);
   /* After this loop device will have size similar to 0x7fffffffffxxxx */
   #blockdev --getsz /dev/loop0
   ##OUTPUT: 36028797018955968
   ##Testcase_end

Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
Cc: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
drivers/block/loop.c