Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9434cec1 authored by Christophe JAILLET's avatar Christophe JAILLET Committed by Greg Kroah-Hartman
Browse files

firmware: Google VPD: Fix memory allocation error handling



This patch fixes several issues:
   - if the 1st 'kzalloc' fails, we dereference a NULL pointer
   - if the 2nd 'kzalloc' fails, there is a memory leak
   - if 'sysfs_create_bin_file' fails there is also a memory leak

Fix it by adding a test after the first memory allocation and some error
handling paths to correctly free memory if needed.

Signed-off-by: default avatarChristophe JAILLET <christophe.jaillet@wanadoo.fr>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b299cde2
Loading
Loading
Loading
Loading
+15 −6
Original line number Original line Diff line number Diff line
@@ -116,9 +116,13 @@ static int vpd_section_attrib_add(const u8 *key, s32 key_len,
		return VPD_OK;
		return VPD_OK;


	info = kzalloc(sizeof(*info), GFP_KERNEL);
	info = kzalloc(sizeof(*info), GFP_KERNEL);
	info->key = kzalloc(key_len + 1, GFP_KERNEL);
	if (!info)
	if (!info->key)
		return -ENOMEM;
		return -ENOMEM;
	info->key = kzalloc(key_len + 1, GFP_KERNEL);
	if (!info->key) {
		ret = -ENOMEM;
		goto free_info;
	}


	memcpy(info->key, key, key_len);
	memcpy(info->key, key, key_len);


@@ -135,12 +139,17 @@ static int vpd_section_attrib_add(const u8 *key, s32 key_len,
	list_add_tail(&info->list, &sec->attribs);
	list_add_tail(&info->list, &sec->attribs);


	ret = sysfs_create_bin_file(sec->kobj, &info->bin_attr);
	ret = sysfs_create_bin_file(sec->kobj, &info->bin_attr);
	if (ret) {
	if (ret)
		kfree(info->key);
		goto free_info_key;
		return ret;
	}


	return 0;
	return 0;

free_info_key:
	kfree(info->key);
free_info:
	kfree(info);

	return ret;
}
}


static void vpd_section_attrib_destroy(struct vpd_section *sec)
static void vpd_section_attrib_destroy(struct vpd_section *sec)