We have two issues: 1. Memory leak of 'attr_name_kobj' in the error handling path. 2. When kobject_init_and_add() fails on every subsequent error path call kobject_put() to cleanup. Both of these issues will be fixed when we add kobject_put() in the goto label, as kfree() is already part of kobject_put(). Fixes: a34fc329b189 ("platform/x86: hp-bioscfg: bioscfg") Reported-by: kernel test robot <lkp@xxxxxxxxx> Reported-by: Dan Carpenter <error27@xxxxxxxxx> Closes: https://lore.kernel.org/r/202309201412.on0VXJGo-lkp@xxxxxxxxx/ Signed-off-by: Harshit Mogalapalli <harshit.m.mogalapalli@xxxxxxxxxx> --- Only compile tested, based on static analysis v1-> v2: Split this into mutliple patches doing one thing in a patch. --- drivers/platform/x86/hp/hp-bioscfg/bioscfg.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/platform/x86/hp/hp-bioscfg/bioscfg.c b/drivers/platform/x86/hp/hp-bioscfg/bioscfg.c index 351d782f3e96..8c9f4f3227fc 100644 --- a/drivers/platform/x86/hp/hp-bioscfg/bioscfg.c +++ b/drivers/platform/x86/hp/hp-bioscfg/bioscfg.c @@ -575,75 +575,77 @@ static void release_attributes_data(void) /** * hp_add_other_attributes() - Initialize HP custom attributes not * reported by BIOS and required to support Secure Platform and Sure * Start. * * @attr_type: Custom HP attribute not reported by BIOS * * Initialize all 2 types of attributes: Platform and Sure Start * object. Populates each attribute types respective properties * under sysfs files. * * Returns zero(0) if successful. Otherwise, a negative value. */ static int hp_add_other_attributes(int attr_type) { struct kobject *attr_name_kobj; int ret; char *attr_name; attr_name_kobj = kzalloc(sizeof(*attr_name_kobj), GFP_KERNEL); if (!attr_name_kobj) return -ENOMEM; mutex_lock(&bioscfg_drv.mutex); /* Check if attribute type is supported */ switch (attr_type) { case HPWMI_SECURE_PLATFORM_TYPE: attr_name_kobj->kset = bioscfg_drv.authentication_dir_kset; attr_name = SPM_STR; break; case HPWMI_SURE_START_TYPE: attr_name_kobj->kset = bioscfg_drv.main_dir_kset; attr_name = SURE_START_STR; break; default: pr_err("Error: Unknown attr_type: %d\n", attr_type); ret = -EINVAL; - goto err_other_attr_init; + kfree(attr_name_kobj); + goto unlock_drv_mutex; } ret = kobject_init_and_add(attr_name_kobj, &attr_name_ktype, NULL, "%s", attr_name); if (ret) { pr_err("Error encountered [%d]\n", ret); - kobject_put(attr_name_kobj); goto err_other_attr_init; } /* Populate attribute data */ switch (attr_type) { case HPWMI_SECURE_PLATFORM_TYPE: ret = hp_populate_secure_platform_data(attr_name_kobj); break; case HPWMI_SURE_START_TYPE: ret = hp_populate_sure_start_data(attr_name_kobj); break; default: ret = -EINVAL; } if (ret) goto err_other_attr_init; mutex_unlock(&bioscfg_drv.mutex); return 0; err_other_attr_init: + kobject_put(attr_name_kobj); +unlock_drv_mutex: mutex_unlock(&bioscfg_drv.mutex); return ret; } -- 2.39.3