mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
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: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Link: https://lore.kernel.org/r/4463268.LvFx2qVVIh@kreacher Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
f89fd04323
commit
0b2a1a3938
@@ -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);
|
||||
|
Reference in New Issue
Block a user