diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index bb50af20b284932efa6cac95098cef9233446ff5..cc9770936c67c0b54a0f3302c5a52493544c7fb7 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -1821,7 +1821,18 @@ static int nbd_dev_add(int index) refcount_set(&nbd->refs, 1); INIT_LIST_HEAD(&nbd->list); disk->major = NBD_MAJOR; + + /* + * Too big index can cause duplicate creation of sysfs files/links, + * because MKDEV() expect that the max first minor is MINORMASK, or + * index << part_shift can overflow. + */ disk->first_minor = index << part_shift; + if (disk->first_minor < index || disk->first_minor > MINORMASK) { + err = -EINVAL; + goto out_free_tags; + } + disk->fops = &nbd_fops; disk->private_data = nbd; sprintf(disk->disk_name, "nbd%d", index);