diff --git a/drivers/gpu/drm/drm_lease.c b/drivers/gpu/drm/drm_lease.c index 94375c6a5425..104e789beb31 100644 --- a/drivers/gpu/drm/drm_lease.c +++ b/drivers/gpu/drm/drm_lease.c @@ -510,6 +510,15 @@ int drm_mode_create_lease_ioctl(struct drm_device *dev, /* Handle leased objects, if any */ idr_init(&leases); if (object_count != 0) { + /* Fail early if object_count is too large */ + if (unlikely(object_count > + KMALLOC_MAX_CACHE_SIZE / + sizeof(struct drm_mode_object *))) { + drm_dbg_lease(dev, "lease object count too large: %i\n", + object_count); + idr_destroy(&leases); + goto out_lessor; + } object_ids = memdup_array_user(u64_to_user_ptr(cl->object_ids), object_count, sizeof(__u32)); if (IS_ERR(object_ids)) {