⬢ DragonFlyBSD Kernel Audit
DF-3686 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
+++ b/sys/dev/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
@@ -944,13 +944,18 @@
 static int smu7_setup_default_dpm_tables(struct pp_hwmgr *hwmgr)
 {
 	struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
+	int result;
 
 	smu7_reset_dpm_tables(hwmgr);
 
 	if (hwmgr->pp_table_version == PP_TABLE_V1)
-		smu7_setup_dpm_tables_v1(hwmgr);
+		result = smu7_setup_dpm_tables_v1(hwmgr);
 	else if (hwmgr->pp_table_version == PP_TABLE_V0)
-		smu7_setup_dpm_tables_v0(hwmgr);
+		result = smu7_setup_dpm_tables_v0(hwmgr);
+	else
+		result = 0;
+	if (result)
+		return result;
 
 	smu7_setup_default_pcie_table(hwmgr);
 
@@ -2734,7 +2739,9 @@
 	int32_t tmp_sclk;
 	int32_t count;
 
-	if (golden_dpm_table->mclk_table.count < 1)
+	if (golden_dpm_table->mclk_table.count < 1 ||
+	    golden_dpm_table->sclk_table.count < 1 ||
+	    golden_dpm_table->pcie_speed_table.count < 1)
 		return -EINVAL;
 
 	percentage = 100 * golden_dpm_table->sclk_table.dpm_levels[golden_dpm_table->sclk_table.count - 1].value /
@@ -3591,7 +3598,8 @@
 	}
 
 	if (i >= sclk_table->count) {
-		if (sclk > sclk_table->dpm_levels[i-1].value) {
+		if (sclk_table->count > 0 &&
+				sclk > sclk_table->dpm_levels[i-1].value) {
 			data->need_update_smu7_dpm_table |= DPMTABLE_OD_UPDATE_SCLK;
 			sclk_table->dpm_levels[i-1].value = sclk;
 		}
@@ -3611,7 +3619,8 @@
 	}
 
 	if (i >= mclk_table->count) {
-		if (mclk > mclk_table->dpm_levels[i-1].value) {
+		if (mclk_table->count > 0 &&
+				mclk > mclk_table->dpm_levels[i-1].value) {
 			data->need_update_smu7_dpm_table |= DPMTABLE_OD_UPDATE_MCLK;
 			mclk_table->dpm_levels[i-1].value = mclk;
 		}
@@ -4531,8 +4540,14 @@
 	struct smu7_single_dpm_table *sclk_table = &(data->dpm_table.sclk_table);
 	struct smu7_single_dpm_table *golden_sclk_table =
 			&(data->golden_dpm_table.sclk_table);
-	int value = sclk_table->dpm_levels[sclk_table->count - 1].value;
-	int golden_value = golden_sclk_table->dpm_levels
+	int value, golden_value;
+
+	if (!sclk_table->count || !golden_sclk_table->count ||
+	    !golden_sclk_table->dpm_levels[golden_sclk_table->count - 1].value)
+		return -EINVAL;
+
+	value = sclk_table->dpm_levels[sclk_table->count - 1].value;
+	golden_value = golden_sclk_table->dpm_levels
 			[golden_sclk_table->count - 1].value;
 
 	value -= golden_value;
@@ -4573,8 +4588,14 @@
 	struct smu7_single_dpm_table *mclk_table = &(data->dpm_table.mclk_table);
 	struct smu7_single_dpm_table *golden_mclk_table =
 			&(data->golden_dpm_table.mclk_table);
-        int value = mclk_table->dpm_levels[mclk_table->count - 1].value;
-	int golden_value = golden_mclk_table->dpm_levels
+        int value, golden_value;
+
+	if (!mclk_table->count || !golden_mclk_table->count ||
+	    !golden_mclk_table->dpm_levels[golden_mclk_table->count - 1].value)
+		return -EINVAL;
+
+	value = mclk_table->dpm_levels[mclk_table->count - 1].value;
+	golden_value = golden_mclk_table->dpm_levels
 			[golden_mclk_table->count - 1].value;
 
 	value -= golden_value;