Message ID | 20240402084955.82273-1-ashwin.kamat@broadcom.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v5.10] block: add check that partition length needs to be aligned with block size | expand |
On Tue, Apr 02, 2024 at 02:19:55PM +0530, Ashwin Dayanand Kamat wrote: > From: Min Li <min15.li@samsung.com> > > [ Upstream commit 6f64f866aa1ae6975c95d805ed51d7e9433a0016] > > Before calling add partition or resize partition, there is no check > on whether the length is aligned with the logical block size. > If the logical block size of the disk is larger than 512 bytes, > then the partition size maybe not the multiple of the logical block size, > and when the last sector is read, bio_truncate() will adjust the bio size, > resulting in an IO error if the size of the read command is smaller than > the logical block size.If integrity data is supported, this will also > result in a null pointer dereference when calling bio_integrity_free. > > Cc: <stable@vger.kernel.org> > Signed-off-by: Min Li <min15.li@samsung.com> > Reviewed-by: Damien Le Moal <dlemoal@kernel.org> > Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com> > Reviewed-by: Christoph Hellwig <hch@lst.de> > Link: https://lore.kernel.org/r/20230629142517.121241-1-min15.li@samsung.com > Signed-off-by: Jens Axboe <axboe@kernel.dk> > Signed-off-by: Ashwin Dayanand Kamat <ashwin.kamat@broadcom.com> > --- > block/ioctl.c | 11 +++++++---- > 1 file changed, 7 insertions(+), 4 deletions(-) Now queued up,t hanks., greg k-h
diff --git a/block/ioctl.c b/block/ioctl.c index e7eed7dad..c490d67fe 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -17,7 +17,7 @@ static int blkpg_do_ioctl(struct block_device *bdev, struct blkpg_partition __user *upart, int op) { struct blkpg_partition p; - long long start, length; + sector_t start, length; if (!capable(CAP_SYS_ADMIN)) return -EACCES; @@ -32,6 +32,12 @@ static int blkpg_do_ioctl(struct block_device *bdev, if (op == BLKPG_DEL_PARTITION) return bdev_del_partition(bdev, 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; @@ -46,9 +52,6 @@ static int blkpg_do_ioctl(struct block_device *bdev, 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(bdev, p.pno, start, length); case BLKPG_RESIZE_PARTITION: return bdev_resize_partition(bdev, p.pno, start, length);