On 3/25/26 18:51, Benjamin Cheng wrote:
> The code accesses the IB without using amdgpu_ib_get_value() so we need
> some additional bounds checks.
> 
> Signed-off-by: Benjamin Cheng <[email protected]>
> ---
>  drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c 
> b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
> index f0f492777b09..1485d92800be 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
> @@ -1928,7 +1928,7 @@ static int vcn_v4_0_enc_find_ib_param(struct amdgpu_ib 
> *ib, uint32_t id, int sta
>  {
>       int i;
>  
> -     for (i = start; i < ib->length_dw && ib->ptr[i] >= 8; i += ib->ptr[i] / 
> 4) {
> +     for (i = start; i + 1 < ib->length_dw && ib->ptr[i] >= 8; i += 
> ib->ptr[i] / 4) {
>               if (ib->ptr[i + 1] == id)
>                       return i;
>       }
> @@ -1952,6 +1952,9 @@ static int vcn_v4_0_ring_patch_cs_in_place(struct 
> amdgpu_cs_parser *p,
>       while ((idx = vcn_v4_0_enc_find_ib_param(ib, RADEON_VCN_ENGINE_INFO, 
> idx)) >= 0) {
>               val = amdgpu_ib_get_value(ib, idx + 2); /* 
> RADEON_VCN_ENGINE_TYPE */
>               if (val == RADEON_VCN_ENGINE_TYPE_DECODE) {
> +                     if (idx + 6 + sizeof(struct amdgpu_vcn_decode_buffer) / 
> 4 > ib->length_dw)
> +                             return -EINVAL;
> +
>                       decode_buffer = (struct amdgpu_vcn_decode_buffer 
> *)&ib->ptr[idx + 6];

We should probably rather stop using the struct here and directly use 
amdgpu_ib_get_value() here.

Regards,
Christian.

>  
>                       if (!(decode_buffer->valid_buf_flag & 0x1))
> @@ -1962,6 +1965,9 @@ static int vcn_v4_0_ring_patch_cs_in_place(struct 
> amdgpu_cs_parser *p,
>                       return vcn_v4_0_dec_msg(p, job, addr);
>               } else if (val == RADEON_VCN_ENGINE_TYPE_ENCODE) {
>                       sidx = vcn_v4_0_enc_find_ib_param(ib, 
> RENCODE_IB_PARAM_SESSION_INIT, idx);
> +                     if (sidx >= 0 && sidx + 2 >= ib->length_dw)
> +                             return -EINVAL;
> +
>                       if (sidx >= 0 && ib->ptr[sidx + 2] == 
> RENCODE_ENCODE_STANDARD_AV1)
>                               return vcn_v4_0_limit_sched(p, job);
>               }

Reply via email to