Skip to content

Commit e5f5a66

Browse files
Anel Orazgaliyevarafaeljw
authored andcommitted
cpuidle: Fix kobject memory leaks in error paths
Commit c343bf1 ("cpuidle: Fix three reference count leaks") fixes the cleanup of kobjects; however, it removes kfree() calls altogether, leading to memory leaks. Fix those and also defer the initialization of dev->kobj_dev until after the error check, so that we do not end up with a dangling pointer. Fixes: c343bf1 ("cpuidle: Fix three reference count leaks") Signed-off-by: Anel Orazgaliyeva <[email protected]> Suggested-by: Aman Priyadarshi <[email protected]> [ rjw: Subject edits ] Signed-off-by: Rafael J. Wysocki <[email protected]>
1 parent c227233 commit e5f5a66

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

drivers/cpuidle/sysfs.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,7 @@ static int cpuidle_add_state_sysfs(struct cpuidle_device *device)
488488
&kdev->kobj, "state%d", i);
489489
if (ret) {
490490
kobject_put(&kobj->kobj);
491+
kfree(kobj);
491492
goto error_state;
492493
}
493494
cpuidle_add_s2idle_attr_group(kobj);
@@ -619,6 +620,7 @@ static int cpuidle_add_driver_sysfs(struct cpuidle_device *dev)
619620
&kdev->kobj, "driver");
620621
if (ret) {
621622
kobject_put(&kdrv->kobj);
623+
kfree(kdrv);
622624
return ret;
623625
}
624626

@@ -705,17 +707,18 @@ int cpuidle_add_sysfs(struct cpuidle_device *dev)
705707
if (!kdev)
706708
return -ENOMEM;
707709
kdev->dev = dev;
708-
dev->kobj_dev = kdev;
709710

710711
init_completion(&kdev->kobj_unregister);
711712

712713
error = kobject_init_and_add(&kdev->kobj, &ktype_cpuidle, &cpu_dev->kobj,
713714
"cpuidle");
714715
if (error) {
715716
kobject_put(&kdev->kobj);
717+
kfree(kdev);
716718
return error;
717719
}
718720

721+
dev->kobj_dev = kdev;
719722
kobject_uevent(&kdev->kobj, KOBJ_ADD);
720723

721724
return 0;

0 commit comments

Comments
 (0)