⬢ DragonFlyBSD Kernel Audit
DF-3611 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/drm/radeon/si_dpm.c
+++ b/sys/dev/drm/radeon/si_dpm.c
@@ -6852,7 +6852,12 @@
 			return -EINVAL;
 		ps = kzalloc(sizeof(struct ni_ps), GFP_KERNEL);
 		if (ps == NULL) {
+			while (i > 0) {
+				i--;
+				kfree(rdev->pm.dpm.ps[i].ps_priv);
+			}
 			kfree(rdev->pm.dpm.ps);
+			rdev->pm.dpm.ps = NULL;
 			return -ENOMEM;
 		}
 		rdev->pm.dpm.ps[i].ps_priv = ps;
@@ -7079,10 +7084,14 @@
 {
 	int i;
 
-	for (i = 0; i < rdev->pm.dpm.num_ps; i++) {
-		kfree(rdev->pm.dpm.ps[i].ps_priv);
+	if (rdev->pm.dpm.ps) {
+		for (i = 0; i < rdev->pm.dpm.num_ps; i++) {
+			kfree(rdev->pm.dpm.ps[i].ps_priv);
+		}
+		kfree(rdev->pm.dpm.ps);
+		rdev->pm.dpm.ps = NULL;
+		rdev->pm.dpm.num_ps = 0;
 	}
-	kfree(rdev->pm.dpm.ps);
 	kfree(rdev->pm.dpm.priv);
 	kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries);
 	r600_free_extended_power_table(rdev);