]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
dm init: Handle minors larger than 255
authorBenjamin Marzinski <bmarzins@redhat.com>
Tue, 2 Jul 2024 10:13:24 +0000 (12:13 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 12 Sep 2024 09:06:47 +0000 (11:06 +0200)
[ Upstream commit 140ce37fd78a629105377e17842465258a5459ef ]

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 <bmarzins@redhat.com>
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/md/dm-init.c

index b0c45c6ebe0bf0c28da7ea29718e59ac44e8f939..f76477044ec1e200419f21be36719fe146faf240 100644 (file)
@@ -207,8 +207,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 */