Commit 7fc33a36 authored by Anel Orazgaliyeva's avatar Anel Orazgaliyeva Committed by Xia Fukun
Browse files

cpuidle: Fix kobject memory leaks in error paths

stable inclusion
from stable-v4.19.294
commit 22d44652b6d6404b96a40bb051d1046e6c005ae5
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I81G0T


CVE: NA

--------------------------------

[ Upstream commit e5f5a66c ]

Commit c343bf1b ("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: c343bf1b ("cpuidle: Fix three reference count leaks")
Signed-off-by: default avatarAnel Orazgaliyeva <anelkz@amazon.de>
Suggested-by: default avatarAman Priyadarshi <apeureka@amazon.de>
[ rjw: Subject edits ]
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Signed-off-by: default avatarXia Fukun <xiafukun@huawei.com>
parent e898cffa
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -481,6 +481,7 @@ static int cpuidle_add_state_sysfs(struct cpuidle_device *device)
					   &kdev->kobj, "state%d", i);
		if (ret) {
			kobject_put(&kobj->kobj);
			kfree(kobj);
			goto error_state;
		}
		cpuidle_add_s2idle_attr_group(kobj);
@@ -612,6 +613,7 @@ static int cpuidle_add_driver_sysfs(struct cpuidle_device *dev)
				   &kdev->kobj, "driver");
	if (ret) {
		kobject_put(&kdrv->kobj);
		kfree(kdrv);
		return ret;
	}

@@ -698,7 +700,6 @@ int cpuidle_add_sysfs(struct cpuidle_device *dev)
	if (!kdev)
		return -ENOMEM;
	kdev->dev = dev;
	dev->kobj_dev = kdev;

	init_completion(&kdev->kobj_unregister);

@@ -706,9 +707,11 @@ int cpuidle_add_sysfs(struct cpuidle_device *dev)
				   "cpuidle");
	if (error) {
		kobject_put(&kdev->kobj);
		kfree(kdev);
		return error;
	}

	dev->kobj_dev = kdev;
	kobject_uevent(&kdev->kobj, KOBJ_ADD);

	return 0;