Commit 0b2a1a39 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki Committed by Greg Kroah-Hartman
Browse files

driver core: class: Clear private pointer on registration failures



Clear the class private pointer if __class_register() fails for it, so
as to allow its users to verify that the class is usable by checking
the value of that pointer.

For consistency, clear that pointer before freeing the object pointed
to by it in class_release().

Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://lore.kernel.org/r/4463268.LvFx2qVVIh@kreacher


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent f89fd043
Loading
Loading
Loading
Loading
+11 −5
Original line number Diff line number Diff line
@@ -53,6 +53,8 @@ static void class_release(struct kobject *kobj)

	pr_debug("class '%s': release.\n", class->name);

	class->p = NULL;

	if (class->class_release)
		class->class_release(class);
	else
@@ -186,17 +188,21 @@ int __class_register(struct class *cls, struct lock_class_key *key)
	cls->p = cp;

	error = kset_register(&cp->subsys);
	if (error) {
		kfree(cp);
		return error;
	}
	if (error)
		goto err_out;

	error = class_add_groups(class_get(cls), cls->class_groups);
	class_put(cls);
	if (error) {
		kobject_del(&cp->subsys.kobj);
		kfree_const(cp->subsys.kobj.name);
		kfree(cp);
		goto err_out;
	}
	return 0;

err_out:
	kfree(cp);
	cls->p = NULL;
	return error;
}
EXPORT_SYMBOL_GPL(__class_register);