DragonFlyBSD Kernel Audit
DF-1353 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/dev/drm/amd/powerplay/hwmgr/vega12_hwmgr.c b/sys/dev/drm/amd/powerplay/hwmgr/vega12_hwmgr.c
--- a/sys/dev/drm/amd/powerplay/hwmgr/vega12_hwmgr.c
+++ b/sys/dev/drm/amd/powerplay/hwmgr/vega12_hwmgr.c
@@ -1807,6 +1807,13 @@
 		soft_min_level = mask ? (ffs(mask) - 1) : 0;
 		soft_max_level = mask ? (fls(mask) - 1) : 0;
 
+		if (soft_min_level >= data->dpm_table.gfx_table.count ||
+		    soft_max_level >= data->dpm_table.gfx_table.count) {
+			pr_err("PP_SCLK mask 0x%08x exceeds dpm levels %d\n",
+				mask, data->dpm_table.gfx_table.count);
+			return -EINVAL;
+		}
+
 		data->dpm_table.gfx_table.dpm_state.soft_min_level =
 			data->dpm_table.gfx_table.dpm_levels[soft_min_level].value;
 		data->dpm_table.gfx_table.dpm_state.soft_max_level =
@@ -1827,6 +1834,13 @@
 		soft_min_level = mask ? (ffs(mask) - 1) : 0;
 		soft_max_level = mask ? (fls(mask) - 1) : 0;
 
+		if (soft_min_level >= data->dpm_table.mem_table.count ||
+		    soft_max_level >= data->dpm_table.mem_table.count) {
+			pr_err("PP_MCLK mask 0x%08x exceeds dpm levels %d\n",
+				mask, data->dpm_table.mem_table.count);
+			return -EINVAL;
+		}
+
 		data->dpm_table.mem_table.dpm_state.soft_min_level =
 			data->dpm_table.mem_table.dpm_levels[soft_min_level].value;
 		data->dpm_table.mem_table.dpm_state.soft_max_level =