Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e577924b authored by Anel Orazgaliyeva's avatar Anel Orazgaliyeva Committed by Greg Kroah-Hartman
Browse files

cpuidle: Fix kobject memory leaks in error paths



[ Upstream commit e5f5a66c9aa9c331da5527c2e3fd9394e7091e01 ]

Commit c343bf1ba5ef ("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: c343bf1ba5ef ("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>
parent 18fdbdbe
Loading
Loading
Loading
Loading
+4 −1
Original line number Original line Diff line number Diff line
@@ -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;