diff options
Diffstat (limited to 'drivers/firmware/google/vpd.c')
| -rw-r--r-- | drivers/firmware/google/vpd.c | 29 | 
1 files changed, 19 insertions, 10 deletions
| diff --git a/drivers/firmware/google/vpd.c b/drivers/firmware/google/vpd.c index 3ce813110d5e..31058d400bda 100644 --- a/drivers/firmware/google/vpd.c +++ b/drivers/firmware/google/vpd.c @@ -116,9 +116,13 @@ static int vpd_section_attrib_add(const u8 *key, s32 key_len,  		return VPD_OK;  	info = kzalloc(sizeof(*info), GFP_KERNEL); -	info->key = kzalloc(key_len + 1, GFP_KERNEL); -	if (!info->key) +	if (!info)  		return -ENOMEM; +	info->key = kzalloc(key_len + 1, GFP_KERNEL); +	if (!info->key) { +		ret = -ENOMEM; +		goto free_info; +	}  	memcpy(info->key, key, key_len); @@ -132,15 +136,20 @@ static int vpd_section_attrib_add(const u8 *key, s32 key_len,  	info->value = value;  	INIT_LIST_HEAD(&info->list); -	list_add_tail(&info->list, &sec->attribs);  	ret = sysfs_create_bin_file(sec->kobj, &info->bin_attr); -	if (ret) { -		kfree(info->key); -		return ret; -	} +	if (ret) +		goto free_info_key; +	list_add_tail(&info->list, &sec->attribs);  	return 0; + +free_info_key: +	kfree(info->key); +free_info: +	kfree(info); + +	return ret;  }  static void vpd_section_attrib_destroy(struct vpd_section *sec) @@ -149,8 +158,8 @@ static void vpd_section_attrib_destroy(struct vpd_section *sec)  	struct vpd_attrib_info *temp;  	list_for_each_entry_safe(info, temp, &sec->attribs, list) { -		kfree(info->key);  		sysfs_remove_bin_file(sec->kobj, &info->bin_attr); +		kfree(info->key);  		kfree(info);  	}  } @@ -235,7 +244,7 @@ static int vpd_section_destroy(struct vpd_section *sec)  {  	if (sec->enabled) {  		vpd_section_attrib_destroy(sec); -		kobject_del(sec->kobj); +		kobject_put(sec->kobj);  		sysfs_remove_bin_file(vpd_kobj, &sec->bin_attr);  		kfree(sec->raw_name);  		iounmap(sec->baseaddr); @@ -322,7 +331,7 @@ static void __exit vpd_platform_exit(void)  {  	vpd_section_destroy(&ro_vpd);  	vpd_section_destroy(&rw_vpd); -	kobject_del(vpd_kobj); +	kobject_put(vpd_kobj);  }  module_init(vpd_platform_init); |