diff options
author | Jens Axboe <axboe@kernel.dk> | 2022-04-02 19:40:23 +0200 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2022-04-02 19:40:23 +0200 |
commit | 7198bfc2017644c6b92d2ecef9b8b8e0363bb5fd (patch) | |
tree | c1ff0a42197d43390cffb77c50018954ff9135e9 /drivers/block/nbd.c | |
parent | drbd: remove check of list iterator against head past the loop body (diff) | |
download | linux-7198bfc2017644c6b92d2ecef9b8b8e0363bb5fd.tar.xz linux-7198bfc2017644c6b92d2ecef9b8b8e0363bb5fd.zip |
Revert "nbd: fix possible overflow on 'first_minor' in nbd_dev_add()"
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>
Diffstat (limited to '')
-rw-r--r-- | drivers/block/nbd.c | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index b3cdfc0ffb98..5a1f98494ddd 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -1800,6 +1800,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; @@ -1904,19 +1915,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; |