On Sat, Jun 13, 2026 at 8:24 PM Mario Limonciello
<[email protected]> wrote:
>
> Add a minimum-length check for the AMDGPU_CHUNK_ID_CP_GFX_SHADOW chunk in
> amdgpu_cs_pass1(), matching the gate already present for the IB, FENCE and
> BO_HANDLES chunk types.
>
> The CP_GFX_SHADOW case previously shared a bare break with the dependency
> and syncobj chunk types, which do not dereference a fixed-size struct. When
> userspace submits this chunk with length_dw == 0, vmemdup_array_user() is
> called with size 0 and returns ZERO_SIZE_PTR, which passes the IS_ERR()
> check. amdgpu_cs_p2_shadow() then dereferences chunk->kdata as a struct
> drm_amdgpu_cs_chunk_cp_gfx_shadow (reading shadow->flags), faulting on the
> ZERO_SIZE_PTR and causing a NULL-pointer dereference.
>
> This is reachable by an unprivileged process in the render group. Reject
> undersized chunks with -EINVAL during pass1 so the bad submission is
> rejected before pass2 ever dereferences the data.
>
> Signed-off-by: Mario Limonciello <[email protected]>

Fixes: ac9287055ff1 ("drm/amdgpu: add gfx shadow CS IOCTL support")

Reviewed-by: Alex Deucher <[email protected]>

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> index 0416827b4bb45..d63fbc7c568de 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> @@ -248,13 +248,17 @@ static int amdgpu_cs_pass1(struct amdgpu_cs_parser *p,
>                                 goto free_partial_kdata;
>                         break;
>
> +               case AMDGPU_CHUNK_ID_CP_GFX_SHADOW:
> +                       if (size < sizeof(struct 
> drm_amdgpu_cs_chunk_cp_gfx_shadow))
> +                               goto free_partial_kdata;
> +                       break;
> +
>                 case AMDGPU_CHUNK_ID_DEPENDENCIES:
>                 case AMDGPU_CHUNK_ID_SYNCOBJ_IN:
>                 case AMDGPU_CHUNK_ID_SYNCOBJ_OUT:
>                 case AMDGPU_CHUNK_ID_SCHEDULED_DEPENDENCIES:
>                 case AMDGPU_CHUNK_ID_SYNCOBJ_TIMELINE_WAIT:
>                 case AMDGPU_CHUNK_ID_SYNCOBJ_TIMELINE_SIGNAL:
> -               case AMDGPU_CHUNK_ID_CP_GFX_SHADOW:
>                         break;
>
>                 default:
> --
> 2.43.0
>

Reply via email to