|
@@ -328,7 +328,11 @@ int blkdev_report_zones_ioctl(struct block_device *bdev, fmode_t mode,
|
|
|
if (!rep.nr_zones)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- zones = kcalloc(rep.nr_zones, sizeof(struct blk_zone), GFP_KERNEL);
|
|
|
+ if (rep.nr_zones > INT_MAX / sizeof(struct blk_zone))
|
|
|
+ return -ERANGE;
|
|
|
+
|
|
|
+ zones = kvmalloc(rep.nr_zones * sizeof(struct blk_zone),
|
|
|
+ GFP_KERNEL | __GFP_ZERO);
|
|
|
if (!zones)
|
|
|
return -ENOMEM;
|
|
|
|
|
@@ -350,7 +354,7 @@ int blkdev_report_zones_ioctl(struct block_device *bdev, fmode_t mode,
|
|
|
}
|
|
|
|
|
|
out:
|
|
|
- kfree(zones);
|
|
|
+ kvfree(zones);
|
|
|
|
|
|
return ret;
|
|
|
}
|