On Fri, Aug 7, 2026 at 4:20 PM David (Ming Qiang) Wu <[email protected]> wrote:
>
> if supplied msg[2] in the header is too large (around
> 0x40000000 and above), 4 times of this unsigned 32 bit value
> will overflow and the test could pass.
>
> Widen it with uint64_t instead. Also drop the redundant
> first check and make the check clear that 6 dwords of
> header plus 4 dwords of each msg cannot exceed the overall
> packet size in dwords.

Maybe cleaner to use check_mul_overflow() and just return an error in that case?

Alex

>
> Signed-off-by: David (Ming Qiang) Wu <[email protected]>
> ---
>  drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c | 2 +-
>  drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c | 2 +-
>  2 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c 
> b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
> index 81bba3ec2a93..06dcf736b15a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
> @@ -1965,7 +1965,7 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, 
> struct amdgpu_job *job,
>         num_buffers = msg[2];
>
>         /* Verify that all indices fit within the claimed length. Each index 
> is 4 DWORDs */
> -       if (num_buffers > len_dw || 6 + num_buffers * 4 > len_dw) {
> +       if ((uint64_t)6 + (uint64_t)num_buffers * 4 > len_dw) {
>                 DRM_ERROR("VCN message has too many buffers!\n");
>                 r = -EINVAL;
>                 goto out;
> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c 
> b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
> index 0cce78b205a8..7950a020f4e1 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
> @@ -1881,7 +1881,7 @@ static int vcn_v4_0_dec_msg(struct amdgpu_cs_parser *p, 
> struct amdgpu_job *job,
>         num_buffers = msg[2];
>
>         /* Verify that all indices fit within the claimed length. Each index 
> is 4 DWORDs */
> -       if (num_buffers > len_dw || 6 + num_buffers * 4 > len_dw) {
> +       if ((uint64_t)6 + (uint64_t)num_buffers * 4 > len_dw) {
>                 DRM_ERROR("VCN message has too many buffers!\n");
>                 r = -EINVAL;
>                 goto out;
> --
> 2.43.0
>

Reply via email to