aboutsummaryrefslogtreecommitdiff
path: root/block
diff options
context:
space:
mode:
authorGravatar Li Lingfeng <lilingfeng3@huawei.com> 2024-03-05 11:21:32 +0800
committerGravatar Jens Axboe <axboe@kernel.dk> 2024-03-06 08:32:06 -0700
commitb9355185d2aeef11f6e365dd98def82212637936 (patch)
tree7d1c573e26956192cdf7e2b12ad3273a95cfafdd /block
parentblock: prevent division by zero in blk_rq_stat_sum() (diff)
downloadlinux-b9355185d2aeef11f6e365dd98def82212637936.tar.gz
linux-b9355185d2aeef11f6e365dd98def82212637936.tar.bz2
linux-b9355185d2aeef11f6e365dd98def82212637936.zip
block: move capacity validation to blkpg_do_ioctl()
Commit 6d4e80db4ebe ("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: Li Lingfeng <lilingfeng3@huawei.com> Reviewed-by: Damien Le Moal <dlemoal@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Link: https://lore.kernel.org/r/20240305032132.548958-1-lilingfeng@huaweicloud.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block')
-rw-r--r--block/ioctl.c9
-rw-r--r--block/partitions/core.c11
2 files changed, 8 insertions, 12 deletions
diff --git a/block/ioctl.c b/block/ioctl.c
index 438f79c564cf..de0cc0d215c6 100644
--- a/block/ioctl.c
+++ b/block/ioctl.c
@@ -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:
diff --git a/block/partitions/core.c b/block/partitions/core.c
index 5f5ed5c75f04..b11e88c82c8c 100644
--- a/block/partitions/core.c
+++ b/block/partitions/core.c
@@ -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;