AMD General

> -----Original Message-----
> From: Zhang, Boyuan <[email protected]>
> Sent: May 12, 2026 10:58 AM
> To: [email protected]
> Cc: Liu, Leo <[email protected]>; Deucher, Alexander
> <[email protected]>; Zhang, Boyuan
> <[email protected]>
> Subject: [PATCH] drm/amdgpu: fix division by zero with invalid uvd
> dimensions
>
> From: Boyuan Zhang <[email protected]>
>
> When width or height is less than 16, width_in_mb or height_in_mb
> becomes 0, leading to fs_in_mb being 0. This causes a division by
> zero when calculating num_dpb_buffer in H264 and H264 Perf decode
> paths.
>
> Add validation to reject frames with width < 16 or height < 16
> before performing any calculations that depend on these values.
>
> Signed-off-by: Boyuan Zhang <[email protected]>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 13 ++++++++++---
>  1 file changed, 10 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> index 3a3bc0d370fa..0cf0f53e5066 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> @@ -628,13 +628,20 @@ static int amdgpu_uvd_cs_msg_decode(struct
> amdgpu_device *adev, uint32_t *msg,
>       unsigned int pitch = msg[28];
>       unsigned int level = msg[57];
>
> +     unsigned int image_size, tmp, min_dpb_size, num_dpb_buffer;
> +     unsigned int min_ctx_size = ~0;
> +
> +     /* Reject invalid dimensions to prevent division by zero */
> +     if (width < 16 || height < 16) {
> +             DRM_ERROR("Invalid UVD decoding dimensions
> (%dx%d)!\n",
> +                       width, height);
> +             return -EINVAL;
> +     }
> +

May be we can move up the variable definition below with the rest definition 
there. With that:
Reviewed-by: Leo Liu <[email protected]>


>       unsigned int width_in_mb = width / 16;
>       unsigned int height_in_mb = ALIGN(height / 16, 2);
>       unsigned int fs_in_mb = width_in_mb * height_in_mb;
>
> -     unsigned int image_size, tmp, min_dpb_size, num_dpb_buffer;
> -     unsigned int min_ctx_size = ~0;
> -
>       image_size = width * height;
>       image_size += image_size / 2;
>       image_size = ALIGN(image_size, 1024);
> --
> 2.43.0

Reply via email to