Re: [PATCH 06/11] drm/vkms: rename struct vkms_color_lut::base to y

[email protected] Tue, 04 Aug 2026 20:52:35 +0000
Newsgroups org.freedesktop.lists.dri-devel
Message-ID <[email protected]>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:

Pre-existing issues:
- [Critical] vkms_composer_worker accesses the global crtc->state asynchronously, creating a Use-After-Free (UAF) vulnerability.
- [High] vkms_atomic_check incorrectly divides gamma_lut length by sizeof(pointer) instead of sizeof(struct) on 32-bit systems.
--

--- Patch [6]: [PATCH 06/11] drm/vkms: rename struct vkms_color_lut::base to y ---
commit 89753bc7023e7c4dac9293962b90fb28fe7958fd
Author: Leandro Ribeiro <[email protected]>

drm/vkms: rename struct vkms_color_lut::base to y

This patch renames the base field in struct vkms_color_lut to y to prepare 
for the addition of an x field in future commits. It updates all usages of 
the field across the driver's tests, composer, and LUT initialization code. 
There is no intended functional change.

> diff --git a/drivers/gpu/drm/vkms/vkms_composer.c b/drivers/gpu/drm/vkms/vkms_composer.c
> --- a/drivers/gpu/drm/vkms/vkms_composer.c
> +++ b/drivers/gpu/drm/vkms/vkms_composer.c

[ ... ]

> @@ -641,7 +641,7 @@ void vkms_composer_worker(struct work_struct *work)
>  		s64 max_lut_index_fp;
>  		s64 u16_max_fp = drm_int2fixp(0xffff);
>  
> -		crtc_state->gamma_lut.base = (struct drm_color_lut *)crtc->state->gamma_lut->data;
> +		crtc_state->gamma_lut.y = (struct drm_color_lut *)crtc->state->gamma_lut->data;

[Severity: Critical]
This isn't a bug introduced by this patch, but does accessing the global
crtc->state asynchronously here create a use-after-free vulnerability?

If userspace submits rapid non-blocking atomic commits, crtc->state can be 
swapped by drm_atomic_helper_commit() and its previous gamma_lut blob freed 
while vkms_composer_worker() is still executing.

Could this lead to the worker dereferencing the freed gamma_lut->data pointer 
later in apply_lut_to_channel_value()?

>  		crtc_state->gamma_lut.lut_length =
>  			crtc->state->gamma_lut->length / sizeof(struct drm_color_lut);
>  		max_lut_index_fp = drm_int2fixp(crtc_state->gamma_lut.lut_length - 1);

[ ... ]

While reviewing the gamma LUT handling, I also noticed the following in
vkms_drv.c:vkms_atomic_check():

> 		if (new_crtc_state->gamma_lut->length / sizeof(struct drm_color_lut *)
> 		    > VKMS_GAMMA_LUT_SIZE)
> 			return -EINVAL;

[Severity: High]
This is a pre-existing issue, but does vkms_atomic_check() incorrectly divide 
by sizeof(struct drm_color_lut *) instead of sizeof(struct drm_color_lut)?

On 32-bit systems where pointers are 4 bytes, a 256-entry LUT evaluates to a 
length of 512, which exceeds VKMS_GAMMA_LUT_SIZE (256) and rejects valid 
atomic commits with -EINVAL.

-- 
Sashiko AI review ยท https://sashiko.dev/#/patchset/[email protected]?part=6