Skip to content

Commit cea6e6e

Browse files
committed
drm/atomic: verify that gamma/degamma LUTs are not too big
The kernel specifies LUT table sizes in a separate property, however it doesn't enforce it as a maximum. Some drivers implement max size check on their own in the atomic_check path. Other drivers simply ignore the issue. Perform LUT size validation in the generic place. Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de> Link: https://patch.msgid.link/20260106-drm-fix-lut-checks-v3-3-f7f979eb73c8@oss.qualcomm.com Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
1 parent ca59e33 commit cea6e6e

1 file changed

Lines changed: 20 additions & 2 deletions

File tree

drivers/gpu/drm/drm_atomic_uapi.c

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -413,10 +413,19 @@ static int drm_atomic_crtc_set_property(struct drm_crtc *crtc,
413413
} else if (property == config->prop_vrr_enabled) {
414414
state->vrr_enabled = val;
415415
} else if (property == config->degamma_lut_property) {
416+
const size_t elem_size = sizeof(struct drm_color_lut);
417+
u64 lut_size;
418+
419+
ret = drm_object_immutable_property_get_value(&crtc->base,
420+
config->degamma_lut_size_property,
421+
&lut_size);
422+
if (ret)
423+
return ret;
424+
416425
ret = drm_property_replace_blob_from_id(dev,
417426
&state->degamma_lut,
418427
val,
419-
-1, -1, sizeof(struct drm_color_lut),
428+
elem_size * lut_size, -1, elem_size,
420429
&replaced);
421430
state->color_mgmt_changed |= replaced;
422431
return ret;
@@ -429,10 +438,19 @@ static int drm_atomic_crtc_set_property(struct drm_crtc *crtc,
429438
state->color_mgmt_changed |= replaced;
430439
return ret;
431440
} else if (property == config->gamma_lut_property) {
441+
const size_t elem_size = sizeof(struct drm_color_lut);
442+
u64 lut_size;
443+
444+
ret = drm_object_immutable_property_get_value(&crtc->base,
445+
config->gamma_lut_size_property,
446+
&lut_size);
447+
if (ret)
448+
return ret;
449+
432450
ret = drm_property_replace_blob_from_id(dev,
433451
&state->gamma_lut,
434452
val,
435-
-1, -1, sizeof(struct drm_color_lut),
453+
elem_size * lut_size, -1, elem_size,
436454
&replaced);
437455
state->color_mgmt_changed |= replaced;
438456
return ret;

0 commit comments

Comments
 (0)