⬢ DragonFlyBSD Kernel Audit
DF-4188 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/drm/radeon/sumo_dpm.c
+++ b/sys/dev/drm/radeon/sumo_dpm.c
@@ -1499,7 +1499,14 @@
 			return -EINVAL;
 		ps = kzalloc(sizeof(struct sumo_ps), GFP_KERNEL);
 		if (ps == NULL) {
+			/* DF-4188: free the already-parsed ps_priv states and
+			 * NULL the array pointer; leaving it dangling makes
+			 * sumo_dpm_fini() double-free it after the (swallowed,
+			 * see radeon_pm.c DF-4162) init failure. */
+			for (i--; 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;