DragonFlyBSD Kernel Audit
DF-1141 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/dev/drm/amd/amdgpu/ci_dpm.c b/sys/dev/drm/amd/amdgpu/ci_dpm.c
--- a/sys/dev/drm/amd/amdgpu/ci_dpm.c
+++ b/sys/dev/drm/amd/amdgpu/ci_dpm.c
@@ -3618,7 +3618,8 @@
 				  SMU7_MAX_LEVELS_MVDD);
 
 	pi->dpm_table.sclk_table.count = 0;
-	for (i = 0; i < allowed_sclk_vddc_table->count; i++) {
+	for (i = 0; i < allowed_sclk_vddc_table->count &&
+		     i < MAX_REGULAR_DPM_NUMBER; i++) {
 		if ((i == 0) ||
 		    (pi->dpm_table.sclk_table.dpm_levels[pi->dpm_table.sclk_table.count-1].value !=
 		     allowed_sclk_vddc_table->entries[i].clk)) {
@@ -3631,7 +3632,8 @@
 	}
 
 	pi->dpm_table.mclk_table.count = 0;
-	for (i = 0; i < allowed_mclk_table->count; i++) {
+	for (i = 0; i < allowed_mclk_table->count &&
+		     i < MAX_REGULAR_DPM_NUMBER; i++) {
 		if ((i == 0) ||
 		    (pi->dpm_table.mclk_table.dpm_levels[pi->dpm_table.mclk_table.count-1].value !=
 		     allowed_mclk_table->entries[i].clk)) {
@@ -3643,33 +3645,39 @@
 		}
 	}
 
-	for (i = 0; i < allowed_sclk_vddc_table->count; i++) {
+	for (i = 0; i < allowed_sclk_vddc_table->count &&
+		     i < MAX_REGULAR_DPM_NUMBER; i++) {
 		pi->dpm_table.vddc_table.dpm_levels[i].value =
 			allowed_sclk_vddc_table->entries[i].v;
 		pi->dpm_table.vddc_table.dpm_levels[i].param1 =
 			std_voltage_table->entries[i].leakage;
 		pi->dpm_table.vddc_table.dpm_levels[i].enabled = true;
 	}
-	pi->dpm_table.vddc_table.count = allowed_sclk_vddc_table->count;
+	pi->dpm_table.vddc_table.count = min((u32)allowed_sclk_vddc_table->count,
+					     (u32)MAX_REGULAR_DPM_NUMBER);
 
 	allowed_mclk_table = &adev->pm.dpm.dyn_state.vddci_dependency_on_mclk;
 	if (allowed_mclk_table) {
-		for (i = 0; i < allowed_mclk_table->count; i++) {
+		for (i = 0; i < allowed_mclk_table->count &&
+			     i < MAX_REGULAR_DPM_NUMBER; i++) {
 			pi->dpm_table.vddci_table.dpm_levels[i].value =
 				allowed_mclk_table->entries[i].v;
 			pi->dpm_table.vddci_table.dpm_levels[i].enabled = true;
 		}
-		pi->dpm_table.vddci_table.count = allowed_mclk_table->count;
+		pi->dpm_table.vddci_table.count = min((u32)allowed_mclk_table->count,
+						      (u32)MAX_REGULAR_DPM_NUMBER);
 	}
 
 	allowed_mclk_table = &adev->pm.dpm.dyn_state.mvdd_dependency_on_mclk;
 	if (allowed_mclk_table) {
-		for (i = 0; i < allowed_mclk_table->count; i++) {
+		for (i = 0; i < allowed_mclk_table->count &&
+			     i < MAX_REGULAR_DPM_NUMBER; i++) {
 			pi->dpm_table.mvdd_table.dpm_levels[i].value =
 				allowed_mclk_table->entries[i].v;
 			pi->dpm_table.mvdd_table.dpm_levels[i].enabled = true;
 		}
-		pi->dpm_table.mvdd_table.count = allowed_mclk_table->count;
+		pi->dpm_table.mvdd_table.count = min((u32)allowed_mclk_table->count,
+						     (u32)MAX_REGULAR_DPM_NUMBER);
 	}
 
 	ci_setup_default_pcie_tables(adev);