summaryrefslogtreecommitdiffstats
path: root/drivers/firmware
diff options
context:
space:
mode:
authorStephen Boyd <swboyd@chromium.org>2018-08-15 22:37:04 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-09-14 15:37:23 +0200
commit20edec388277b62ddfddb8b2b376a937a2cd6d1b (patch)
treec9c10a7332a80a78ecc5b754178ee97ea5917466 /drivers/firmware
parentfirmware: coreboot: Let OF core populate platform device (diff)
downloadlinux-20edec388277b62ddfddb8b2b376a937a2cd6d1b.tar.xz
linux-20edec388277b62ddfddb8b2b376a937a2cd6d1b.zip
firmware: coreboot: Unmap ioregion after device population
Both callers of coreboot_table_init() ioremap the pointer that comes in but they don't unmap the memory on failure. Both of them also fail probe immediately with the return value of coreboot_table_init(), leaking a mapping when it fails. The mapping isn't necessary at all after devices are populated either, so we can just drop the mapping here when we exit the function. Let's do that to simplify the code a bit and plug the leak. Cc: Wei-Ning Huang <wnhuang@chromium.org> Cc: Julius Werner <jwerner@chromium.org> Cc: Brian Norris <briannorris@chromium.org> Cc: Samuel Holland <samuel@sholland.org> Fixes: 570d30c2823f ("firmware: coreboot: Expose the coreboot table as a bus") Signed-off-by: Stephen Boyd <swboyd@chromium.org> Reviewed-by: Julius Werner <jwerner@chromium.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/firmware')
-rw-r--r--drivers/firmware/google/coreboot_table.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/firmware/google/coreboot_table.c b/drivers/firmware/google/coreboot_table.c
index 19db5709ae28..898bb9abc41f 100644
--- a/drivers/firmware/google/coreboot_table.c
+++ b/drivers/firmware/google/coreboot_table.c
@@ -110,7 +110,8 @@ int coreboot_table_init(struct device *dev, void __iomem *ptr)
if (strncmp(header.signature, "LBIO", sizeof(header.signature))) {
pr_warn("coreboot_table: coreboot table missing or corrupt!\n");
- return -ENODEV;
+ ret = -ENODEV;
+ goto out;
}
ptr_entry = (void *)ptr_header + header.header_bytes;
@@ -137,7 +138,8 @@ int coreboot_table_init(struct device *dev, void __iomem *ptr)
ptr_entry += entry.size;
}
-
+out:
+ iounmap(ptr);
return ret;
}
EXPORT_SYMBOL(coreboot_table_init);
@@ -146,7 +148,6 @@ int coreboot_table_exit(void)
{
if (ptr_header) {
bus_unregister(&coreboot_bus_type);
- iounmap(ptr_header);
ptr_header = NULL;
}