DragonFlyBSD Kernel Audit
DF-1385 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/dev/drm/radeon/cypress_dpm.c b/sys/dev/drm/radeon/cypress_dpm.c
--- a/sys/dev/drm/radeon/cypress_dpm.c
+++ b/sys/dev/drm/radeon/cypress_dpm.c
@@ -1084,6 +1084,17 @@
 	if (ret)
 		return ret;
 
+	/* num_entries comes from the VBIOS usModuleSize and drives the loop
+	 * in cypress_retrieve_ac_timing_for_all_ranges() writing
+	 * mc_reg_table_entry[NUM_ENTRIES] where NUM_ENTRIES = MAX_AC_TIMING_ENTRIES
+	 * = 16. btc_dpm.c:1995 validates this; cypress did not. */
+	if (range_table.num_entries > MAX_AC_TIMING_ENTRIES) {
+		dev_warn(rdev->dev, "cypress_dpm: VBIOS mclk range table "
+			 "num_entries %u > %d, clamping\n",
+			 range_table.num_entries, MAX_AC_TIMING_ENTRIES);
+		range_table.num_entries = MAX_AC_TIMING_ENTRIES;
+	}
+
 	cypress_retrieve_ac_timing_for_all_ranges(rdev, &range_table);
 
 	return 0;