summaryrefslogtreecommitdiffstats
path: root/drivers/firmware/qemu_fw_cfg.c
diff options
context:
space:
mode:
authorQiushi Wu <wu000273@umn.edu>2020-06-13 21:05:33 +0200
committerMichael S. Tsirkin <mst@redhat.com>2020-07-29 19:13:50 +0200
commitfe3c60684377d5ad9b0569b87ed3e26e12c8173b (patch)
tree2cc428956b90a91a15ff8d4c09ee523a6bdcb591 /drivers/firmware/qemu_fw_cfg.c
parentLinux 5.8-rc7 (diff)
downloadlinux-fe3c60684377d5ad9b0569b87ed3e26e12c8173b.tar.xz
linux-fe3c60684377d5ad9b0569b87ed3e26e12c8173b.zip
firmware: Fix a reference count leak.
kobject_init_and_add() takes reference even when it fails. If this function returns an error, kobject_put() must be called to properly clean up the memory associated with the object. Callback function fw_cfg_sysfs_release_entry() in kobject_put() can handle the pointer "entry" properly. Signed-off-by: Qiushi Wu <wu000273@umn.edu> Link: https://lore.kernel.org/r/20200613190533.15712-1-wu000273@umn.edu Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'drivers/firmware/qemu_fw_cfg.c')
-rw-r--r--drivers/firmware/qemu_fw_cfg.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/firmware/qemu_fw_cfg.c b/drivers/firmware/qemu_fw_cfg.c
index 039e0f91dba8..6945c3c96637 100644
--- a/drivers/firmware/qemu_fw_cfg.c
+++ b/drivers/firmware/qemu_fw_cfg.c
@@ -605,8 +605,10 @@ static int fw_cfg_register_file(const struct fw_cfg_file *f)
/* register entry under "/sys/firmware/qemu_fw_cfg/by_key/" */
err = kobject_init_and_add(&entry->kobj, &fw_cfg_sysfs_entry_ktype,
fw_cfg_sel_ko, "%d", entry->select);
- if (err)
- goto err_register;
+ if (err) {
+ kobject_put(&entry->kobj);
+ return err;
+ }
/* add raw binary content access */
err = sysfs_create_bin_file(&entry->kobj, &fw_cfg_sysfs_attr_raw);
@@ -622,7 +624,6 @@ static int fw_cfg_register_file(const struct fw_cfg_file *f)
err_add_raw:
kobject_del(&entry->kobj);
-err_register:
kfree(entry);
return err;
}