FAILED: patch "[PATCH] nbd: fix possible overflow on 'first_minor' in nbd_dev_add()" failed to apply to 5.15-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 6d35d04a9e18990040e87d2bbf72689252669d54 Mon Sep 17 00:00:00 2001
From: Zhang Wensheng <[email protected]>
Date: Thu, 10 Mar 2022 17:32:24 +0800
Subject: [PATCH] nbd: fix possible overflow on 'first_minor' in nbd_dev_add()
When 'index' is a big numbers, it may become negative which forced to 'int'. then 'index << part_shift' might overflow to a positive value that is not greater than '0xfffff', then sysfs might complains about duplicate creation. Because of this, move the 'index' judgment to the front will fix it and be better.
drivers/block/nbd.c +12 -12
@@ -1800,17 +1800,6 @@ 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;
@@ -1915,8 +1904,19 @@ 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 ;