drm/amd/display: Fix index may exceed array range within fpu_update_bw_bounding_box
authorHersen Wu <hersenxs.wu@amd.com>
Thu, 25 Apr 2024 13:24:44 +0000 (09:24 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 2 May 2024 20:18:18 +0000 (16:18 -0400)
[Why]
Coverity reports OVERRUN warning. soc.num_states could
be 40. But array range of bw_params->clk_table.entries is 8.

[How]
Assert if soc.num_states greater than 8.

Reviewed-by: Alex Hung <alex.hung@amd.com>
Acked-by: Tom Chung <chiahsuan.chung@amd.com>
Signed-off-by: Hersen Wu <hersenxs.wu@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dml/dcn302/dcn302_fpu.c
drivers/gpu/drm/amd/display/dc/dml/dcn303/dcn303_fpu.c
drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c
drivers/gpu/drm/amd/display/dc/dml/dcn321/dcn321_fpu.c

index e2bcd20..8da97a9 100644 (file)
@@ -304,6 +304,16 @@ void dcn302_fpu_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_p
                        dram_speed_mts[num_states++] = bw_params->clk_table.entries[j++].memclk_mhz * 16;
                }
 
+               /* bw_params->clk_table.entries[MAX_NUM_DPM_LVL].
+                * MAX_NUM_DPM_LVL is 8.
+                * dcn3_02_soc.clock_limits[DC__VOLTAGE_STATES].
+                * DC__VOLTAGE_STATES is 40.
+                */
+               if (num_states > MAX_NUM_DPM_LVL) {
+                       ASSERT(0);
+                       return;
+               }
+
                dcn3_02_soc.num_states = num_states;
                for (i = 0; i < dcn3_02_soc.num_states; i++) {
                        dcn3_02_soc.clock_limits[i].state = i;
index 3f02bb8..e968870 100644 (file)
@@ -310,6 +310,16 @@ void dcn303_fpu_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_p
                        dram_speed_mts[num_states++] = bw_params->clk_table.entries[j++].memclk_mhz * 16;
                }
 
+               /* bw_params->clk_table.entries[MAX_NUM_DPM_LVL].
+                * MAX_NUM_DPM_LVL is 8.
+                * dcn3_02_soc.clock_limits[DC__VOLTAGE_STATES].
+                * DC__VOLTAGE_STATES is 40.
+                */
+               if (num_states > MAX_NUM_DPM_LVL) {
+                       ASSERT(0);
+                       return;
+               }
+
                dcn3_03_soc.num_states = num_states;
                for (i = 0; i < dcn3_03_soc.num_states; i++) {
                        dcn3_03_soc.clock_limits[i].state = i;
index d74f51e..7aba711 100644 (file)
@@ -3232,6 +3232,16 @@ void dcn32_update_bw_bounding_box_fpu(struct dc *dc, struct clk_bw_params *bw_pa
                                dram_speed_mts[num_states++] = bw_params->clk_table.entries[j++].memclk_mhz * 16;
                        }
 
+                       /* bw_params->clk_table.entries[MAX_NUM_DPM_LVL].
+                        * MAX_NUM_DPM_LVL is 8.
+                        * dcn3_02_soc.clock_limits[DC__VOLTAGE_STATES].
+                        * DC__VOLTAGE_STATES is 40.
+                        */
+                       if (num_states > MAX_NUM_DPM_LVL) {
+                               ASSERT(0);
+                               return;
+                       }
+
                        dcn3_2_soc.num_states = num_states;
                        for (i = 0; i < dcn3_2_soc.num_states; i++) {
                                dcn3_2_soc.clock_limits[i].state = i;
index ff4d795..4297402 100644 (file)
@@ -803,6 +803,16 @@ void dcn321_update_bw_bounding_box_fpu(struct dc *dc, struct clk_bw_params *bw_p
                        dram_speed_mts[num_states++] = bw_params->clk_table.entries[j++].memclk_mhz * 16;
                }
 
+               /* bw_params->clk_table.entries[MAX_NUM_DPM_LVL].
+                * MAX_NUM_DPM_LVL is 8.
+                * dcn3_02_soc.clock_limits[DC__VOLTAGE_STATES].
+                * DC__VOLTAGE_STATES is 40.
+                */
+               if (num_states > MAX_NUM_DPM_LVL) {
+                       ASSERT(0);
+                       return;
+               }
+
                dcn3_21_soc.num_states = num_states;
                for (i = 0; i < dcn3_21_soc.num_states; i++) {
                        dcn3_21_soc.clock_limits[i].state = i;