ACPICA: Hardware: Fix a resource leak issue in acpi_hw_build_pci_list().
authorLv Zheng <lv.zheng@intel.com>
Thu, 21 May 2015 02:31:12 +0000 (10:31 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 22 May 2015 01:22:20 +0000 (03:22 +0200)
ACPICA commit e4f0b73c107680841d7dd01cc04ec108df6580bd

There is code in acpi_hw_build_pci_list() destructing returned object
(return_list_head) before touching it while the allocated new object
(list_head) is not tracked correctly to be destructed on the error case,
which is detected as unsecure code by the "Coverity" tool.

This patch fixes this issue by always intializing the returned object in
acpi_hw_build_pci_list() so that the caller of acpi_hw_build_pci_list() needn't
initialize it and always using the returned object to track the new
allocated objects. Lv Zheng.

Link: https://github.com/acpica/acpica/commit/e4f0b73c
Link: https://jira01.devtools.intel.com/browse/LCK-2143
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpica/hwpci.c

index c5214dec49880cd0678943e15ece6c6211bf3291..f785ea7883565d54d35228e2a725a6815327047a 100644 (file)
@@ -123,7 +123,7 @@ acpi_hw_derive_pci_id(struct acpi_pci_id *pci_id,
                      acpi_handle root_pci_device, acpi_handle pci_region)
 {
        acpi_status status;
-       struct acpi_pci_device *list_head = NULL;
+       struct acpi_pci_device *list_head;
 
        ACPI_FUNCTION_TRACE(hw_derive_pci_id);
 
@@ -177,13 +177,13 @@ acpi_hw_build_pci_list(acpi_handle root_pci_device,
        acpi_handle parent_device;
        acpi_status status;
        struct acpi_pci_device *list_element;
-       struct acpi_pci_device *list_head = NULL;
 
        /*
         * Ascend namespace branch until the root_pci_device is reached, building
         * a list of device nodes. Loop will exit when either the PCI device is
         * found, or the root of the namespace is reached.
         */
+       *return_list_head = NULL;
        current_device = pci_region;
        while (1) {
                status = acpi_get_parent(current_device, &parent_device);
@@ -198,7 +198,6 @@ acpi_hw_build_pci_list(acpi_handle root_pci_device,
                /* Finished when we reach the PCI root device (PNP0A03 or PNP0A08) */
 
                if (parent_device == root_pci_device) {
-                       *return_list_head = list_head;
                        return (AE_OK);
                }
 
@@ -213,9 +212,9 @@ acpi_hw_build_pci_list(acpi_handle root_pci_device,
 
                /* Put new element at the head of the list */
 
-               list_element->next = list_head;
+               list_element->next = *return_list_head;
                list_element->device = parent_device;
-               list_head = list_element;
+               *return_list_head = list_element;
 
                current_device = parent_device;
        }