DragonFlyBSD Kernel Audit
DF-1179 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/dev/drm/amd/powerplay/hwmgr/vega10_hwmgr.c b/sys/dev/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
--- a/sys/dev/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
+++ b/sys/dev/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
@@ -1202,10 +1202,14 @@
 		struct phm_ppt_v1_clock_voltage_dependency_table *dep_table)
 {
 	int i;
+	uint32_t dep_count = dep_table->count;
+
+	if (dep_count > MAX_REGULAR_DPM_NUMBER)
+		dep_count = MAX_REGULAR_DPM_NUMBER;
 
 	dpm_table->count = 0;
 
-	for (i = 0; i < dep_table->count; i++) {
+	for (i = 0; i < dep_count; i++) {
 		if (i == 0 || dpm_table->dpm_levels[dpm_table->count - 1].value <=
 				dep_table->entries[i].clk) {
 			dpm_table->dpm_levels[dpm_table->count].value =
@@ -1340,7 +1344,7 @@
 
 	data->dpm_table.eclk_table.count = 0;
 	dpm_table = &(data->dpm_table.eclk_table);
-	for (i = 0; i < dep_mm_table->count; i++) {
+	for (i = 0; i < min(dep_mm_table->count, (uint32_t)MAX_REGULAR_DPM_NUMBER); i++) {
 		if (i == 0 || dpm_table->dpm_levels
 				[dpm_table->count - 1].value <=
 						dep_mm_table->entries[i].eclk) {
@@ -1356,7 +1360,7 @@
 	data->dpm_table.vclk_table.count = 0;
 	data->dpm_table.dclk_table.count = 0;
 	dpm_table = &(data->dpm_table.vclk_table);
-	for (i = 0; i < dep_mm_table->count; i++) {
+	for (i = 0; i < min(dep_mm_table->count, (uint32_t)MAX_REGULAR_DPM_NUMBER); i++) {
 		if (i == 0 || dpm_table->dpm_levels
 				[dpm_table->count - 1].value <=
 						dep_mm_table->entries[i].vclk) {
@@ -1370,7 +1374,7 @@
 	vega10_init_dpm_state(&(dpm_table->dpm_state));
 
 	dpm_table = &(data->dpm_table.dclk_table);
-	for (i = 0; i < dep_mm_table->count; i++) {
+	for (i = 0; i < min(dep_mm_table->count, (uint32_t)MAX_REGULAR_DPM_NUMBER); i++) {
 		if (i == 0 || dpm_table->dpm_levels
 				[dpm_table->count - 1].value <=
 						dep_mm_table->entries[i].dclk) {