Re: [PATCH 2/2] drm/amd/display: validate plane degamma LUT size for private color prop
Melissa Wen <[email protected]>
| Newsgroups | org.freedesktop.lists.amd-gfx,org.kernel.vger.stable |
|---|---|
| Message-ID | <[email protected]> |
On 04/08/2026 23:04, Harry Wentland wrote:
> Unlike the CRTC degamma path, which is guarded by
> amdgpu_dm_verify_lut_sizes(), the per-plane degamma LUT size was never
> validated before use. __set_dm_plane_degamma() passed the user-supplied
> size straight into __is_lut_linear() and, for a non-linear LUT, into
> __set_input_tf() -> __drm_lut_to_dc_gamma(), the latter always iterating
> MAX_COLOR_LUT_ENTRIES entries regardless of the actual LUT size.
>
> A malformed AMD_PLANE_DEGAMMA_LUT blob (e.g. a single entry) could thus
> trigger a divide-by-zero in __is_lut_linear() or an out-of-bounds read in
> __drm_lut_to_dc_gamma(). Reject any plane degamma LUT whose size does not
> match MAX_COLOR_LUT_ENTRIES, mirroring the invariant the code already
> asserts a few lines below (and which the CRTC path enforces).
>
> The AMD_PLANE_DEGAMMA_LUT property is only exposed on builds with
> AMD_PRIVATE_COLOR defined.
>
> Fixes: 980f8710075a ("drm/amd/display: add plane degamma TF and LUT support")
> Cc: [email protected]
> Signed-off-by: Harry Wentland <[email protected]>
> ---
> drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
> index 26e5c89375a5..d55dc06167a8 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
> @@ -1495,6 +1495,13 @@ __set_dm_plane_degamma(struct drm_plane_state *plane_state,
> degamma_lut = __extract_blob_lut(dm_plane_state->degamma_lut,
> °amma_size);
>
> + if (degamma_lut && degamma_size != MAX_COLOR_LUT_ENTRIES) {
> + drm_dbg(plane_state->state->dev,
> + "Invalid Plane Degamma LUT size. Should be %u but got %u.\n",
> + MAX_COLOR_LUT_ENTRIES, degamma_size);
> + return -EINVAL;
> + }
> +
LGTM
Thanks!
Reviewed-by: Melissa Wen <[email protected]>
> has_degamma_lut = degamma_lut &&
> !__is_lut_linear(degamma_lut, degamma_size);
>