From: Benjamin Marzinski Date: Tue, 2 Jul 2024 10:13:24 +0000 (+0200) Subject: dm init: Handle minors larger than 255 X-Git-Tag: v6.11-rc1~113^2~27 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=140ce37fd78a629105377e17842465258a5459ef;p=thirdparty%2Flinux.git dm init: Handle minors larger than 255 dm_parse_device_entry() simply copies the minor number into dmi.dev, but the dev_t format splits the minor number between the lowest 8 bytes and highest 12 bytes. If the minor number is larger than 255, part of it will end up getting treated as the major number Fix this by checking that the minor number is valid and then encoding it as a dev_t. Signed-off-by: Benjamin Marzinski Signed-off-by: Mikulas Patocka --- diff --git a/drivers/md/dm-init.c b/drivers/md/dm-init.c index 2a71bcdba92d1..b37bbe7625003 100644 --- a/drivers/md/dm-init.c +++ b/drivers/md/dm-init.c @@ -212,8 +212,10 @@ static char __init *dm_parse_device_entry(struct dm_device *dev, char *str) strscpy(dev->dmi.uuid, field[1], sizeof(dev->dmi.uuid)); /* minor */ if (strlen(field[2])) { - if (kstrtoull(field[2], 0, &dev->dmi.dev)) + if (kstrtoull(field[2], 0, &dev->dmi.dev) || + dev->dmi.dev >= (1 << MINORBITS)) return ERR_PTR(-EINVAL); + dev->dmi.dev = huge_encode_dev((dev_t)dev->dmi.dev); dev->dmi.flags |= DM_PERSISTENT_DEV_FLAG; } /* flags */