From c4e462d2ff30bc5d9a066d87de6f0461ac6bc585 Mon Sep 17 00:00:00 2001 From: Yufen Yu Date: Thu, 1 Jul 2021 17:49:56 +0800 Subject: [PATCH] block: check disk exist before trying to add partition hulk inclusion category: bugfix bugzilla: 168631 CVE: NA ------------------------------------------------- If disk have been deleted, we should return fail for ioctl BLKPG_DEL_PARTITION. Otherwise, the directory /sys/class/block may remain invalid symlinks file. The race as following: blkdev_open del_gendisk disk->flags &= ~GENHD_FL_UP; blk_drop_partitions blkpg_ioctl bdev_add_partition add_partition device_add device_add_class_symlinks ioctl may add_partition after del_gendisk() have tried to delete partitions. Then, symlinks file will be created. Link: https://lore.kernel.org/linux-block/20210608092707.1062259-1-yuyufen@huawei.com/ Signed-off-by: Yufen Yu Reviewed-by: Jason Yan Signed-off-by: Chen Jun Signed-off-by: Zheng Zengkai --- block/partitions/core.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/block/partitions/core.c b/block/partitions/core.c index a02e22411594..758ecc3de802 100644 --- a/block/partitions/core.c +++ b/block/partitions/core.c @@ -519,17 +519,26 @@ int bdev_add_partition(struct block_device *bdev, int partno, sector_t start, sector_t length) { struct hd_struct *part; + struct gendisk *disk = bdev->bd_disk; + int ret; mutex_lock(&bdev->bd_mutex); - if (partition_overlaps(bdev->bd_disk, start, length, -1)) { - mutex_unlock(&bdev->bd_mutex); - return -EBUSY; + if (!(disk->flags & GENHD_FL_UP)) { + ret = -ENXIO; + goto out; + } + + if (partition_overlaps(disk, start, length, -1)) { + ret = -EBUSY; + goto out; } - part = add_partition(bdev->bd_disk, partno, start, length, + part = add_partition(disk, partno, start, length, ADDPART_FLAG_NONE, NULL); + ret = PTR_ERR_OR_ZERO(part); +out: mutex_unlock(&bdev->bd_mutex); - return PTR_ERR_OR_ZERO(part); + return ret; } int bdev_del_partition(struct block_device *bdev, int partno) -- GitLab