block: move CAP_SYS_ADMIN check in blkdev_roset()
authorIlya Dryomov <idryomov@gmail.com>
Wed, 18 Oct 2017 12:38:38 +0000 (14:38 +0200)
committerJens Axboe <axboe@kernel.dk>
Wed, 25 Oct 2017 18:25:00 +0000 (12:25 -0600)
Check for CAP_SYS_ADMIN before calling into the driver, similar to
blkdev_flushbuf().  This is safer and can spare a check in the driver.

(Currently BLKROSET is overridden by md and rbd, rbd is missing the
check.  md has the check, but it covers a lot more than BLKROSET.)

Acked-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/ioctl.c

index c0fc32bd8ed17b1c2998d56ce692c64681f30f7e..1668506d8ed80607b6e3c279fa22195fb73571de 100644 (file)
@@ -443,11 +443,12 @@ static int blkdev_roset(struct block_device *bdev, fmode_t mode,
 {
        int ret, n;
 
+       if (!capable(CAP_SYS_ADMIN))
+               return -EACCES;
+
        ret = __blkdev_driver_ioctl(bdev, mode, cmd, arg);
        if (!is_unrecognized_ioctl(ret))
                return ret;
-       if (!capable(CAP_SYS_ADMIN))
-               return -EACCES;
        if (get_user(n, (int __user *)arg))
                return -EFAULT;
        set_device_ro(bdev, n);