| From cbf519c647a8978f646591a15f04911dc3959c25 Mon Sep 17 00:00:00 2001 |
| From: Evan Quan <evan.quan@amd.com> |
| Date: Tue, 8 Jan 2019 10:33:35 +0800 |
| Subject: drm/amd/powerplay: avoid possible buffer overflow |
| |
| [ Upstream commit fff0d3f7686942bd544b53a48d1b76bd62c46946 ] |
| |
| Make sure the clock level enforced is within the allowed |
| ranges. |
| |
| Signed-off-by: Evan Quan <evan.quan@amd.com> |
| Reviewed-by: Alex Deucher <alexander.deucher@amd.com> |
| Reviewed-by: Likun Gao <Likun.Gao@amd.com> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c | 14 ++++++++++++++ |
| 1 file changed, 14 insertions(+) |
| |
| diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c |
| index 3b7fce5d7258..b9e19b0eb905 100644 |
| --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c |
| +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c |
| @@ -2244,6 +2244,13 @@ static int vega20_force_clock_level(struct pp_hwmgr *hwmgr, |
| soft_min_level = mask ? (ffs(mask) - 1) : 0; |
| soft_max_level = mask ? (fls(mask) - 1) : 0; |
| |
| + if (soft_max_level >= data->dpm_table.gfx_table.count) { |
| + pr_err("Clock level specified %d is over max allowed %d\n", |
| + soft_max_level, |
| + data->dpm_table.gfx_table.count - 1); |
| + return -EINVAL; |
| + } |
| + |
| data->dpm_table.gfx_table.dpm_state.soft_min_level = |
| data->dpm_table.gfx_table.dpm_levels[soft_min_level].value; |
| data->dpm_table.gfx_table.dpm_state.soft_max_level = |
| @@ -2264,6 +2271,13 @@ static int vega20_force_clock_level(struct pp_hwmgr *hwmgr, |
| soft_min_level = mask ? (ffs(mask) - 1) : 0; |
| soft_max_level = mask ? (fls(mask) - 1) : 0; |
| |
| + if (soft_max_level >= data->dpm_table.mem_table.count) { |
| + pr_err("Clock level specified %d is over max allowed %d\n", |
| + soft_max_level, |
| + data->dpm_table.mem_table.count - 1); |
| + return -EINVAL; |
| + } |
| + |
| data->dpm_table.mem_table.dpm_state.soft_min_level = |
| data->dpm_table.mem_table.dpm_levels[soft_min_level].value; |
| data->dpm_table.mem_table.dpm_state.soft_max_level = |
| -- |
| 2.19.1 |
| |