⬢ DragonFlyBSD Kernel Audit
DF-4145 / fix.diff
← back to finding ↓ download raw
--- a/dev/drm/radeon/trinity_dpm.c
+++ b/dev/drm/radeon/trinity_dpm.c
@@ -1616,6 +1616,7 @@
 			ps->Dpm0PgNbPsHi = 0x1;
 			ps->DpmXNbPsLo = force_high ? 0x2 : 0x3;
 			ps->DpmXNbPsHi = 0x2;
+			if (ps->num_levels > 0)
 			ps->levels[ps->num_levels - 1].allow_gnb_slow = 0;
 		}
 	}
@@ -1798,6 +1799,16 @@
 						       clock_info);
 			k++;
 		}
+		if (k == 0) {
+			DRM_ERROR("power state %d has no dpm levels\n", i);
+			for (k = i - 1; k >= 0; k--)
+				kfree(rdev->pm.dpm.ps[k].ps_priv);
+			kfree(rdev->pm.dpm.ps);
+			rdev->pm.dpm.ps = NULL;
+			rdev->pm.dpm.boot_ps = NULL;
+			rdev->pm.dpm.uvd_ps = NULL;
+			return -EINVAL;
+		}
 		trinity_parse_pplib_non_clock_info(rdev, &rdev->pm.dpm.ps[i],
 						   non_clock_info,
 						   non_clock_info_array->ucEntrySize);