⬢ DragonFlyBSD Kernel Audit
DF-4023 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/drm/radeon/rv770_dpm.c
+++ b/sys/dev/drm/radeon/rv770_dpm.c
@@ -2305,7 +2305,12 @@
 			u8 *idx;
 			ps = kzalloc(sizeof(struct rv7xx_ps), GFP_KERNEL);
 			if (ps == NULL) {
+				int j;
+
+				for (j = 0; j < i; j++)
+					kfree(rdev->pm.dpm.ps[j].ps_priv);
 				kfree(rdev->pm.dpm.ps);
+				rdev->pm.dpm.ps = NULL;
 				return -ENOMEM;
 			}
 			rdev->pm.dpm.ps[i].ps_priv = ps;
@@ -2544,11 +2549,15 @@
 {
 	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 != NULL) {
+		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;
 	}
-	kfree(rdev->pm.dpm.ps);
 	kfree(rdev->pm.dpm.priv);
+	rdev->pm.dpm.priv = NULL;
 }
 
 u32 rv770_dpm_get_sclk(struct radeon_device *rdev, bool low)