]> git.itanic.dy.fi Git - linux-stable/commitdiff
Revert "nbd: fix possible overflow on 'first_minor' in nbd_dev_add()"
authorJens Axboe <axboe@kernel.dk>
Sat, 2 Apr 2022 17:40:23 +0000 (11:40 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 13 Apr 2022 18:59:26 +0000 (20:59 +0200)
commit 7198bfc2017644c6b92d2ecef9b8b8e0363bb5fd upstream.

This reverts commit 6d35d04a9e18990040e87d2bbf72689252669d54.

Both Gabriel and Borislav report that this commit casues a regression
with nbd:

sysfs: cannot create duplicate filename '/dev/block/43:0'

Revert it before 5.18-rc1 and we'll investigage this separately in
due time.

Link: https://lore.kernel.org/all/YkiJTnFOt9bTv6A2@zn.tnic/
Reported-by: Gabriel L. Somlo <somlo@cmu.edu>
Reported-by: Borislav Petkov <bp@alien8.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/block/nbd.c

index 1c62262304be6493b1151bf02962db01ccd6e7a6..582b23befb5c45e21888d67d61b87882cca31c5c 100644 (file)
@@ -1744,6 +1744,17 @@ static struct nbd_device *nbd_dev_add(int index, unsigned int refs)
        refcount_set(&nbd->refs, 0);
        INIT_LIST_HEAD(&nbd->list);
        disk->major = NBD_MAJOR;
+
+       /* Too big first_minor can cause duplicate creation of
+        * sysfs files/links, since index << part_shift might overflow, or
+        * MKDEV() expect that the max bits of first_minor is 20.
+        */
+       disk->first_minor = index << part_shift;
+       if (disk->first_minor < index || disk->first_minor > MINORMASK) {
+               err = -EINVAL;
+               goto out_free_work;
+       }
+
        disk->minors = 1 << part_shift;
        disk->fops = &nbd_fops;
        disk->private_data = nbd;
@@ -1848,19 +1859,8 @@ static int nbd_genl_connect(struct sk_buff *skb, struct genl_info *info)
        if (!netlink_capable(skb, CAP_SYS_ADMIN))
                return -EPERM;
 
-       if (info->attrs[NBD_ATTR_INDEX]) {
+       if (info->attrs[NBD_ATTR_INDEX])
                index = nla_get_u32(info->attrs[NBD_ATTR_INDEX]);
-
-               /*
-                * Too big first_minor can cause duplicate creation of
-                * sysfs files/links, since index << part_shift might overflow, or
-                * MKDEV() expect that the max bits of first_minor is 20.
-                */
-               if (index < 0 || index > MINORMASK >> part_shift) {
-                       printk(KERN_ERR "nbd: illegal input index %d\n", index);
-                       return -EINVAL;
-               }
-       }
        if (!info->attrs[NBD_ATTR_SOCKETS]) {
                printk(KERN_ERR "nbd: must specify at least one socket\n");
                return -EINVAL;