Commit b9355185 authored by Li Lingfeng's avatar Li Lingfeng Committed by Jens Axboe
Browse files

block: move capacity validation to blkpg_do_ioctl()



Commit 6d4e80db ("block: add capacity validation in
bdev_add_partition()") add check of partition's start and end sectors to
prevent exceeding the size of the disk when adding partitions. However,
there is still no check for resizing partitions now.
Move the check to blkpg_do_ioctl() to cover resizing partitions.

Signed-off-by: default avatarLi Lingfeng <lilingfeng3@huawei.com>
Reviewed-by: default avatarDamien Le Moal <dlemoal@kernel.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20240305032132.548958-1-lilingfeng@huaweicloud.com


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 93f52fbe
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@ static int blkpg_do_ioctl(struct block_device *bdev,
{
	struct gendisk *disk = bdev->bd_disk;
	struct blkpg_partition p;
	sector_t start, length;
	sector_t start, length, capacity, end;

	if (!capable(CAP_SYS_ADMIN))
		return -EACCES;
@@ -41,6 +41,13 @@ static int blkpg_do_ioctl(struct block_device *bdev,

	start = p.start >> SECTOR_SHIFT;
	length = p.length >> SECTOR_SHIFT;
	capacity = get_capacity(disk);

	if (check_add_overflow(start, length, &end))
		return -EINVAL;

	if (start >= capacity || end > capacity)
		return -EINVAL;

	switch (op) {
	case BLKPG_ADD_PARTITION:
+0 −11
Original line number Diff line number Diff line
@@ -419,21 +419,10 @@ static bool partition_overlaps(struct gendisk *disk, sector_t start,
int bdev_add_partition(struct gendisk *disk, int partno, sector_t start,
		sector_t length)
{
	sector_t capacity = get_capacity(disk), end;
	struct block_device *part;
	int ret;

	mutex_lock(&disk->open_mutex);
	if (check_add_overflow(start, length, &end)) {
		ret = -EINVAL;
		goto out;
	}

	if (start >= capacity || end > capacity) {
		ret = -EINVAL;
		goto out;
	}

	if (!disk_live(disk)) {
		ret = -ENXIO;
		goto out;