[PATCH] drm/radeon: fix potential buffer overflow in ni_set_mc_special_registers()

Alex Deucher alexdeucher at gmail.com
Mon Jun 6 17:16:27 UTC 2022


Applied.  Thanks!

Alex

On Mon, Jun 6, 2022 at 9:51 AM Alexey Kodanev
<aleksei.kodanev at bell-sw.com> wrote:
>
> The last case label can write two buffers 'mc_reg_address[j]' and
> 'mc_data[j]' with 'j' offset equal to SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE
> since there are no checks for this value in both case labels after the
> last 'j++'.
>
> Instead of changing '>' to '>=' there, add the bounds check at the start
> of the second 'case' (the first one already has it).
>
> Also, remove redundant last checks for 'j' index bigger than array size.
> The expression is always false. Moreover, before or after the patch
> 'table->last' can be equal to SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE and it
> seems it can be a valid value.
>
> Detected using the static analysis tool - Svace.
> Fixes: 69e0b57a91ad ("drm/radeon/kms: add dpm support for cayman (v5)")
> Signed-off-by: Alexey Kodanev <aleksei.kodanev at bell-sw.com>
> ---
>  drivers/gpu/drm/radeon/ni_dpm.c | 6 ++----
>  1 file changed, 2 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/ni_dpm.c b/drivers/gpu/drm/radeon/ni_dpm.c
> index 769f666335ac..672d2239293e 100644
> --- a/drivers/gpu/drm/radeon/ni_dpm.c
> +++ b/drivers/gpu/drm/radeon/ni_dpm.c
> @@ -2741,10 +2741,10 @@ static int ni_set_mc_special_registers(struct radeon_device *rdev,
>                                         table->mc_reg_table_entry[k].mc_data[j] |= 0x100;
>                         }
>                         j++;
> -                       if (j > SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE)
> -                               return -EINVAL;
>                         break;
>                 case MC_SEQ_RESERVE_M >> 2:
> +                       if (j >= SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE)
> +                               return -EINVAL;
>                         temp_reg = RREG32(MC_PMG_CMD_MRS1);
>                         table->mc_reg_address[j].s1 = MC_PMG_CMD_MRS1 >> 2;
>                         table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_MRS1_LP >> 2;
> @@ -2753,8 +2753,6 @@ static int ni_set_mc_special_registers(struct radeon_device *rdev,
>                                         (temp_reg & 0xffff0000) |
>                                         (table->mc_reg_table_entry[k].mc_data[i] & 0x0000ffff);
>                         j++;
> -                       if (j > SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE)
> -                               return -EINVAL;
>                         break;
>                 default:
>                         break;
> --
> 2.25.1
>


More information about the amd-gfx mailing list