driver core: class: Clear private pointer on registration failures
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 20 Jan 2023 19:46:57 +0000 (20:46 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 23 Jan 2023 13:47:18 +0000 (14:47 +0100)
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>
drivers/base/class.c

index 3366da9c3ff6ebfdd7367289dfa98e90560d8bad..a38b0d7d681d7026c796b3549cc2d6f734189d9b 100644 (file)
@@ -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);