[RFC PATCH v3 05/23] drm/vkms: Avoid reading beyond LUT array
Arthur Grillo
arthurgrillo at riseup.net
Fri Nov 10 12:42:28 UTC 2023
On 08/11/23 13:36, Harry Wentland wrote:
> When the floor LUT index (drm_fixp2int(lut_index) is the last
> index of the array the ceil LUT index will point to an entry
> beyond the array. Make sure we guard against it and use the
> value of the floor LUT index.
>
> v3:
> - Drop bits from commit description that didn't contribute
> anything of value
>
> Signed-off-by: Harry Wentland <harry.wentland at amd.com>
> Cc: Arthur Grillo <arthurgrillo at riseup.net>
LGTM
Reviewed-by: Arthur Grillo <arthurgrillo at riseup.net>
Best Regards,
~Arthur Grillo
> ---
> drivers/gpu/drm/vkms/vkms_composer.c | 14 ++++++++++----
> 1 file changed, 10 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/vkms/vkms_composer.c b/drivers/gpu/drm/vkms/vkms_composer.c
> index 6f942896036e..25b6b73bece8 100644
> --- a/drivers/gpu/drm/vkms/vkms_composer.c
> +++ b/drivers/gpu/drm/vkms/vkms_composer.c
> @@ -123,6 +123,8 @@ static u16 apply_lut_to_channel_value(const struct vkms_color_lut *lut, u16 chan
> enum lut_channel channel)
> {
> s64 lut_index = get_lut_index(lut, channel_value);
> + u16 *floor_lut_value, *ceil_lut_value;
> + u16 floor_channel_value, ceil_channel_value;
>
> /*
> * This checks if `struct drm_color_lut` has any gap added by the compiler
> @@ -130,11 +132,15 @@ static u16 apply_lut_to_channel_value(const struct vkms_color_lut *lut, u16 chan
> */
> static_assert(sizeof(struct drm_color_lut) == sizeof(__u16) * 4);
>
> - u16 *floor_lut_value = (__u16 *)&lut->base[drm_fixp2int(lut_index)];
> - u16 *ceil_lut_value = (__u16 *)&lut->base[drm_fixp2int_ceil(lut_index)];
> + floor_lut_value = (__u16 *)&lut->base[drm_fixp2int(lut_index)];
> + if (drm_fixp2int(lut_index) == (lut->lut_length - 1))
> + /* We're at the end of the LUT array, use same value for ceil and floor */
> + ceil_lut_value = floor_lut_value;
> + else
> + ceil_lut_value = (__u16 *)&lut->base[drm_fixp2int_ceil(lut_index)];
>
> - u16 floor_channel_value = floor_lut_value[channel];
> - u16 ceil_channel_value = ceil_lut_value[channel];
> + floor_channel_value = floor_lut_value[channel];
> + ceil_channel_value = ceil_lut_value[channel];
>
> return lerp_u16(floor_channel_value, ceil_channel_value,
> lut_index & DRM_FIXED_DECIMAL_MASK);
More information about the wayland-devel
mailing list