⬢ DragonFlyBSD Kernel Audit
DF-4022 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/drm/radeon/rv770_dpm.c
+++ b/sys/dev/drm/radeon/rv770_dpm.c
@@ -1901,6 +1901,11 @@
 	struct radeon_ps *boot_ps = rdev->pm.dpm.boot_ps;
 	int ret;
 
+	if (boot_ps == NULL || boot_ps->ps_priv == NULL) {
+		DRM_ERROR("no usable boot power state in power table\n");
+		return -EINVAL;
+	}
+
 	if (pi->gfx_clock_gating)
 		rv770_restore_cgcg(rdev);
 
--- a/sys/dev/drm/radeon/radeon_pm.c
+++ b/sys/dev/drm/radeon/radeon_pm.c
@@ -1445,7 +1445,11 @@
 
 	INIT_WORK(&rdev->pm.dpm.thermal.work, radeon_dpm_thermal_work_handler);
 	mutex_lock(&rdev->pm.mutex);
-	radeon_dpm_init(rdev);
+	ret = radeon_dpm_init(rdev);
+	if (ret) {
+		mutex_unlock(&rdev->pm.mutex);
+		goto dpm_failed;
+	}
 	rdev->pm.dpm.current_ps = rdev->pm.dpm.requested_ps = rdev->pm.dpm.boot_ps;
 	if (radeon_dpm == 1)
 		radeon_dpm_print_power_states(rdev);