DragonFlyBSD Kernel Audit
DF-1354 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/dev/drm/amd/powerplay/hwmgr/vega12_hwmgr.c b/sys/dev/drm/amd/powerplay/hwmgr/vega12_hwmgr.c
--- a/sys/dev/drm/amd/powerplay/hwmgr/vega12_hwmgr.c
+++ b/sys/dev/drm/amd/powerplay/hwmgr/vega12_hwmgr.c
@@ -1969,8 +1969,12 @@
 
 	/* Hardmin is dependent on displayconfig */
 	if (disable_mclk_switching) {
+		if (dpm_table->count == 0)
+			return -EINVAL;
 		dpm_table->dpm_state.hard_min_level = dpm_table->dpm_levels[dpm_table->count - 1].value;
-		for (i = 0; i < data->mclk_latency_table.count - 1; i++) {
+		for (i = 0; i < data->mclk_latency_table.count &&
+			    i < dpm_table->count &&
+			    i < MAX_REGULAR_DPM_NUMBER - 1; i++) {
 			if (data->mclk_latency_table.entries[i].latency <= latency) {
 				if (dpm_table->dpm_levels[i].value >= (hwmgr->display_config->min_mem_set_clock / 100)) {
 					dpm_table->dpm_state.hard_min_level = dpm_table->dpm_levels[i].value;
@@ -1980,8 +1984,11 @@
 		}
 	}
 
-	if (hwmgr->display_config->nb_pstate_switch_disable)
+	if (hwmgr->display_config->nb_pstate_switch_disable) {
+		if (dpm_table->count == 0)
+			return -EINVAL;
 		dpm_table->dpm_state.hard_min_level = dpm_table->dpm_levels[dpm_table->count - 1].value;
+	}
 
 	/* vclk */
 	dpm_table = &(data->dpm_table.vclk_table);