⬢ DragonFlyBSD Kernel Audit
DF-3705 / 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
@@ -2057,6 +2057,11 @@ static int vega10_populate_clock_stretche
 	struct phm_ppt_v1_clock_voltage_dependency_table *dep_table =
 			table_info->vdd_dep_on_sclk;
 	uint32_t i;
 
+	PP_ASSERT_WITH_CODE(dep_table->count <= NUM_GFXCLK_DPM_LEVELS,
+			"Number Of Entries Exceeded maximum!",
+			return -1);
+
 	for (i = 0; i < dep_table->count; i++) {
 		pp_table->CksEnable[i] = dep_table->entries[i].cks_enable;
 		pp_table->CksVidOffset[i] = (uint8_t)(dep_table->entries[i].cks_voffset
@@ -2140,6 +2145,11 @@ static int vega10_populate_avfs_parameters
 			pp_table->AcgAvfsGb.b_shift             = 0;
 
+			PP_ASSERT_WITH_CODE(dep_table->count <= NUM_GFXCLK_DPM_LEVELS,
+					"Number Of Entries Exceeded maximum!",
+					return -1);
+
 			for (i = 0; i < dep_table->count; i++)
 				pp_table->StaticVoltageOffsetVid[i] =
 						convert_to_vid((uint8_t)(dep_table->entries[i].sclk_offset));
@@ -2027,6 +2027,11 @@ static int vega10_populate_smc_uvd_levels
 	int result = -EINVAL;
 	uint32_t i, j;
 
+	PP_ASSERT_WITH_CODE(dep_table->count <= NUM_UVD_DPM_LEVELS,
+			"Number Of MM Entries Exceeded maximum!",
+			return -1);
+
 	for (i = 0; i < vclk_dpm_table->count; i++) {
 		result = vega10_populate_single_vclock_level(hwmgr,
@@ -1697,6 +1697,12 @@ static void vega10_populate_vddc_soc_leve
 	else
 		vddc_lookup_table = table_info->vddc_lookup_table;
 
+	if (vddc_lookup_table->count > NUM_EVV_VOLTAGE_LEVELS) {
+		pr_info("Number Of VDDC Lookup Entries Exceeded maximum!\n");
+		vddc_lookup_table->count = NUM_EVV_VOLTAGE_LEVELS;
+	}
+
 	max_vddc_level = vddc_lookup_table->count;
 	for (i = 0; i < max_vddc_level; i++) {