| From d2be00c0fb5ae0794deffcdb0425cd5a8d823db0 Mon Sep 17 00:00:00 2001 |
| From: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> |
| Date: Tue, 27 Jan 2015 18:01:45 +0000 |
| Subject: of/pci: Free resources on failure in of_pci_get_host_bridge_resources() |
| |
| From: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> |
| |
| commit d2be00c0fb5ae0794deffcdb0425cd5a8d823db0 upstream. |
| |
| In the function of_pci_get_host_bridge_resources() if the parsing of ranges |
| fails, previously allocated resources inclusive of bus_range are not freed |
| and are not expected to be freed by the function caller on error return. |
| |
| This patch fixes the issues by adding code that properly frees resources |
| and bus_range before exiting the function with an error return value. |
| |
| Fixes: cbe4097f8ae6 ("of/pci: Add support for parsing PCI host bridge resources from DT") |
| Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> |
| Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> |
| Acked-by: Liviu Dudau <liviu.dudau@arm.com> |
| CC: Arnd Bergmann <arnd@arndb.de> |
| CC: Rob Herring <robh+dt@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/of/of_pci.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| --- a/drivers/of/of_pci.c |
| +++ b/drivers/of/of_pci.c |
| @@ -140,6 +140,7 @@ int of_pci_get_host_bridge_resources(str |
| unsigned char busno, unsigned char bus_max, |
| struct list_head *resources, resource_size_t *io_base) |
| { |
| + struct pci_host_bridge_window *window; |
| struct resource *res; |
| struct resource *bus_range; |
| struct of_pci_range range; |
| @@ -225,7 +226,10 @@ int of_pci_get_host_bridge_resources(str |
| conversion_failed: |
| kfree(res); |
| parse_failed: |
| + list_for_each_entry(window, resources, list) |
| + kfree(window->res); |
| pci_free_resource_list(resources); |
| + kfree(bus_range); |
| return err; |
| } |
| EXPORT_SYMBOL_GPL(of_pci_get_host_bridge_resources); |