⬢ DragonFlyBSD Kernel Audit
DF-3620 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/drm/amd/amdgpu/ci_dpm.c
+++ b/sys/dev/drm/amd/amdgpu/ci_dpm.c
@@ -2476,6 +2476,9 @@ static int ci_get_std_voltage_value_sidd
 	if (adev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries == NULL)
 		return -EINVAL;
 
+	if (adev->pm.dpm.dyn_state.cac_leakage_table.entries &&
+	    adev->pm.dpm.dyn_state.cac_leakage_table.count == 0)
+		return -EINVAL;
+
 	if (adev->pm.dpm.dyn_state.cac_leakage_table.entries) {
 		for (v_index = 0; (u32)v_index < adev->pm.dpm.dyn_state.vddc_dependency_on_sclk.count; v_index++) {
 			if (voltage_table->value ==
--- a/sys/dev/drm/amd/amdgpu/amdgpu_dpm.c
+++ b/sys/dev/drm/amd/amdgpu/amdgpu_dpm.c
@@ -499,7 +499,8 @@ int amdgpu_parse_extended_power_table(st
 			ATOM_PPLIB_CAC_Leakage_Record *entry;
 			u32 size = cac_table->ucNumEntries * sizeof(struct amdgpu_cac_leakage_table);
 			adev->pm.dpm.dyn_state.cac_leakage_table.entries = kzalloc(size, GFP_KERNEL);
-			if (!adev->pm.dpm.dyn_state.cac_leakage_table.entries) {
+			if (cac_table->ucNumEntries == 0 ||
+			    !adev->pm.dpm.dyn_state.cac_leakage_table.entries) {
 				amdgpu_free_extended_power_table(adev);
 				return -ENOMEM;
 			}