Merge tag 'drm-next-2024-01-15-1' of git://anongit.freedesktop.org/drm/drm
[linux-2.6-microblaze.git] / block / ioctl.c
index 4160f4e..9c73a76 100644 (file)
@@ -18,7 +18,7 @@ static int blkpg_do_ioctl(struct block_device *bdev,
 {
        struct gendisk *disk = bdev->bd_disk;
        struct blkpg_partition p;
-       long long start, length;
+       sector_t start, length;
 
        if (disk->flags & GENHD_FL_NO_PART)
                return -EINVAL;
@@ -35,14 +35,17 @@ static int blkpg_do_ioctl(struct block_device *bdev,
        if (op == BLKPG_DEL_PARTITION)
                return bdev_del_partition(disk, p.pno);
 
+       if (p.start < 0 || p.length <= 0 || p.start + p.length < 0)
+               return -EINVAL;
+       /* Check that the partition is aligned to the block size */
+       if (!IS_ALIGNED(p.start | p.length, bdev_logical_block_size(bdev)))
+               return -EINVAL;
+
        start = p.start >> SECTOR_SHIFT;
        length = p.length >> SECTOR_SHIFT;
 
        switch (op) {
        case BLKPG_ADD_PARTITION:
-               /* check if partition is aligned to blocksize */
-               if (p.start & (bdev_logical_block_size(bdev) - 1))
-                       return -EINVAL;
                return bdev_add_partition(disk, p.pno, start, length);
        case BLKPG_RESIZE_PARTITION:
                return bdev_resize_partition(disk, p.pno, start, length);