| From e8ade91757eaf66bd2dcbc6e07ec3ed9c6942129 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 20 Feb 2024 09:14:25 +0530 |
| Subject: drm/amd/display: Prevent potential buffer overflow in |
| map_hw_resources |
| |
| From: Srinivasan Shanmugam <srinivasan.shanmugam@amd.com> |
| |
| [ Upstream commit 0f8ca019544a252d1afb468ce840c6dcbac73af4 ] |
| |
| Adds a check in the map_hw_resources function to prevent a potential |
| buffer overflow. The function was accessing arrays using an index that |
| could potentially be greater than the size of the arrays, leading to a |
| buffer overflow. |
| |
| Adds a check to ensure that the index is within the bounds of the |
| arrays. If the index is out of bounds, an error message is printed and |
| break it will continue execution with just ignoring extra data early to |
| prevent the buffer overflow. |
| |
| Reported by smatch: |
| drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml2_wrapper.c:79 map_hw_resources() error: buffer overflow 'dml2->v20.scratch.dml_to_dc_pipe_mapping.disp_cfg_to_stream_id' 6 <= 7 |
| drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml2_wrapper.c:81 map_hw_resources() error: buffer overflow 'dml2->v20.scratch.dml_to_dc_pipe_mapping.disp_cfg_to_plane_id' 6 <= 7 |
| |
| Fixes: 7966f319c66d ("drm/amd/display: Introduce DML2") |
| Cc: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com> |
| Cc: Roman Li <roman.li@amd.com> |
| Cc: Qingqing Zhuo <Qingqing.Zhuo@amd.com> |
| Cc: Aurabindo Pillai <aurabindo.pillai@amd.com> |
| Cc: Tom Chung <chiahsuan.chung@amd.com> |
| Signed-off-by: Srinivasan Shanmugam <srinivasan.shanmugam@amd.com> |
| Suggested-by: Roman Li <roman.li@amd.com> |
| Reviewed-by: Roman Li <roman.li@amd.com> |
| Reviewed-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.c | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| diff --git a/drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.c b/drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.c |
| index 8f231418870f2..c62b61ac45d27 100644 |
| --- a/drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.c |
| +++ b/drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.c |
| @@ -76,6 +76,11 @@ static void map_hw_resources(struct dml2_context *dml2, |
| in_out_display_cfg->hw.DLGRefClkFreqMHz = 50; |
| } |
| for (j = 0; j < mode_support_info->DPPPerSurface[i]; j++) { |
| + if (i >= __DML2_WRAPPER_MAX_STREAMS_PLANES__) { |
| + dml_print("DML::%s: Index out of bounds: i=%d, __DML2_WRAPPER_MAX_STREAMS_PLANES__=%d\n", |
| + __func__, i, __DML2_WRAPPER_MAX_STREAMS_PLANES__); |
| + break; |
| + } |
| dml2->v20.scratch.dml_to_dc_pipe_mapping.dml_pipe_idx_to_stream_id[num_pipes] = dml2->v20.scratch.dml_to_dc_pipe_mapping.disp_cfg_to_stream_id[i]; |
| dml2->v20.scratch.dml_to_dc_pipe_mapping.dml_pipe_idx_to_stream_id_valid[num_pipes] = true; |
| dml2->v20.scratch.dml_to_dc_pipe_mapping.dml_pipe_idx_to_plane_id[num_pipes] = dml2->v20.scratch.dml_to_dc_pipe_mapping.disp_cfg_to_plane_id[i]; |
| -- |
| 2.43.0 |
| |