mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-30 08:02:30 +00:00
cpuidle: Fix kobject memory leaks in error paths
[ Upstream commite5f5a66c9a
] Commitc343bf1ba5
("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:c343bf1ba5
("cpuidle: Fix three reference count leaks") Signed-off-by: Anel Orazgaliyeva <anelkz@amazon.de> Suggested-by: Aman Priyadarshi <apeureka@amazon.de> [ rjw: Subject edits ] Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
18fdbdbecf
commit
e577924b70
1 changed files with 4 additions and 1 deletions
|
@ -481,6 +481,7 @@ static int cpuidle_add_state_sysfs(struct cpuidle_device *device)
|
||||||
&kdev->kobj, "state%d", i);
|
&kdev->kobj, "state%d", i);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
kobject_put(&kobj->kobj);
|
kobject_put(&kobj->kobj);
|
||||||
|
kfree(kobj);
|
||||||
goto error_state;
|
goto error_state;
|
||||||
}
|
}
|
||||||
cpuidle_add_s2idle_attr_group(kobj);
|
cpuidle_add_s2idle_attr_group(kobj);
|
||||||
|
@ -612,6 +613,7 @@ static int cpuidle_add_driver_sysfs(struct cpuidle_device *dev)
|
||||||
&kdev->kobj, "driver");
|
&kdev->kobj, "driver");
|
||||||
if (ret) {
|
if (ret) {
|
||||||
kobject_put(&kdrv->kobj);
|
kobject_put(&kdrv->kobj);
|
||||||
|
kfree(kdrv);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -698,7 +700,6 @@ int cpuidle_add_sysfs(struct cpuidle_device *dev)
|
||||||
if (!kdev)
|
if (!kdev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
kdev->dev = dev;
|
kdev->dev = dev;
|
||||||
dev->kobj_dev = kdev;
|
|
||||||
|
|
||||||
init_completion(&kdev->kobj_unregister);
|
init_completion(&kdev->kobj_unregister);
|
||||||
|
|
||||||
|
@ -706,9 +707,11 @@ int cpuidle_add_sysfs(struct cpuidle_device *dev)
|
||||||
"cpuidle");
|
"cpuidle");
|
||||||
if (error) {
|
if (error) {
|
||||||
kobject_put(&kdev->kobj);
|
kobject_put(&kdev->kobj);
|
||||||
|
kfree(kdev);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dev->kobj_dev = kdev;
|
||||||
kobject_uevent(&kdev->kobj, KOBJ_ADD);
|
kobject_uevent(&kdev->kobj, KOBJ_ADD);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in a new issue