⬢ DragonFlyBSD Kernel Audit
DF-3701 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
+++ b/sys/dev/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
@@ -4122,7 +4122,8 @@ static void vega10_get_sclks(struct pp_h
 	clocks->num_levels = 0;
-	for (i = 0; i < dep_table->count; i++) {
+	for (i = 0; i < dep_table->count && i < PP_MAX_CLOCK_LEVELS; i++) {
 		if (dep_table->entries[i].clk) {
 			clocks->data[clocks->num_levels].clocks_in_khz =
 					dep_table->entries[i].clk * 10;
@@ -4143,7 +4144,8 @@ static void vega10_get_memclocks(struct
 	uint32_t j = 0;
 	uint32_t i;
 
-	for (i = 0; i < dep_table->count; i++) {
+	/* data[] is PP_MAX_CLOCK_LEVELS; mclk_latency_table.entries[] is 8 */
+	for (i = 0; i < dep_table->count && i < PP_MAX_CLOCK_LEVELS; i++) {
 		if (dep_table->entries[i].clk) {
 
 			clocks->data[j].clocks_in_khz =
@@ -4167,7 +4169,8 @@ static void vega10_get_dcefclocks(struct
 	uint32_t i;
 
-	for (i = 0; i < dep_table->count; i++) {
+	clocks->num_levels = 0;
+	for (i = 0; i < dep_table->count && i < PP_MAX_CLOCK_LEVELS; i++) {
 		clocks->data[i].clocks_in_khz = dep_table->entries[i].clk * 10;
 		clocks->data[i].latency_in_us = 0;
 		clocks->num_levels++;
@@ -4183,7 +4186,8 @@ static void vega10_get_socclocks(struct
 	uint32_t i;
 
-	for (i = 0; i < dep_table->count; i++) {
+	clocks->num_levels = 0;
+	for (i = 0; i < dep_table->count && i < PP_MAX_CLOCK_LEVELS; i++) {
 		clocks->data[i].clocks_in_khz = dep_table->entries[i].clk * 10;
 		clocks->data[i].latency_in_us = 0;
 		clocks->num_levels++;
@@ -4243,7 +4247,8 @@ static int vega10_get_clock_by_type_with_
 	}
 
-	for (i = 0; i < dep_table->count; i++) {
+	clocks->num_levels = 0;
+	for (i = 0; i < dep_table->count && i < PP_MAX_CLOCK_LEVELS; i++) {
 		clocks->data[i].clocks_in_khz = dep_table->entries[i].clk  * 10;
 		clocks->data[i].voltage_in_mv = (uint32_t)(table_info->vddc_lookup_table->
 				entries[dep_table->entries[i].vddInd].us_vdd);