⬢ DragonFlyBSD Kernel Audit
DF-4125 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/drm/radeon/rv6xx_dpm.c
+++ b/sys/dev/drm/radeon/rv6xx_dpm.c
@@ -1905,10 +1905,15 @@ static int rv6xx_parse_power_table(struct radeon_device *rdev)
 		if (power_info->pplib.ucStateEntrySize - 1) {
 			u8 *idx;
 			ps = kzalloc(sizeof(struct rv6xx_ps), GFP_KERNEL);
 			if (ps == NULL) {
-				kfree(rdev->pm.dpm.ps);
+				while (i--)
+					kfree(rdev->pm.dpm.ps[i].ps_priv);
+				kfree(rdev->pm.dpm.ps);
+				rdev->pm.dpm.ps = NULL;
 				return -ENOMEM;
 			}
--- a/sys/dev/drm/radeon/radeon_pm.c
+++ b/sys/dev/drm/radeon/radeon_pm.c
@@ -1445,7 +1445,10 @@ static int radeon_pm_init_dpm(struct radeon_device *rdev)
 	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)
+		goto dpm_failed_unlock;
 	rdev->pm.dpm.current_ps = rdev->pm.dpm.requested_ps = rdev->pm.dpm.boot_ps;
# NOTE: authored against the read-only sys/ tree after verification; never applied there.