platform/x86: dell-wmi-sysman: fix init_bios_attributes() error handling
authorDan Carpenter <dan.carpenter@oracle.com>
Tue, 3 Nov 2020 10:17:35 +0000 (13:17 +0300)
committerHans de Goede <hdegoede@redhat.com>
Mon, 9 Nov 2020 11:54:24 +0000 (12:54 +0100)
Calling release_attributes_data() while holding the "wmi_priv.mutex"
will lead to a dead lock.  The other problem is that if kzalloc() fails
then this should return -ENOMEM but currently it returns success.

Fixes: e8a60aa7404b ("platform/x86: Introduce support for Systems Management Driver over WMI for Dell Systems")
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Link: https://lore.kernel.org/r/20201103101735.GB1127762@mwanda
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
drivers/platform/x86/dell-wmi-sysman/sysman.c

index c6862c3..dc6dd53 100644 (file)
@@ -443,8 +443,10 @@ static int init_bios_attributes(int attr_type, const char *guid)
 
                /* build attribute */
                attr_name_kobj = kzalloc(sizeof(*attr_name_kobj), GFP_KERNEL);
-               if (!attr_name_kobj)
+               if (!attr_name_kobj) {
+                       retval = -ENOMEM;
                        goto err_attr_init;
+               }
 
                attr_name_kobj->kset = tmp_set;
 
@@ -486,13 +488,13 @@ nextobj:
                elements = obj ? obj->package.elements : NULL;
        }
 
-       goto out;
+       mutex_unlock(&wmi_priv.mutex);
+       return 0;
 
 err_attr_init:
+       mutex_unlock(&wmi_priv.mutex);
        release_attributes_data();
        kfree(obj);
-out:
-       mutex_unlock(&wmi_priv.mutex);
        return retval;
 }