[PATCH] pci: aspm: free memory from lists
Colin King
colin.king at canonical.com
Tue May 15 19:02:52 UTC 2012
From: Colin Ian King <colin.king at canonical.com>
free lspci text lists and pci device lists correctly. valgrind
found a bunch of memory allocations that were not being freed.
Signed-off-by: Colin Ian King <colin.king at canonical.com>
---
src/pci/aspm/aspm.c | 32 ++++++++++++++++++++++----------
1 file changed, 22 insertions(+), 10 deletions(-)
diff --git a/src/pci/aspm/aspm.c b/src/pci/aspm/aspm.c
index c461ce8..fe6cb60 100644
--- a/src/pci/aspm/aspm.c
+++ b/src/pci/aspm/aspm.c
@@ -188,6 +188,17 @@ int pcie_compare_rp_dev_aspm_registers(fwts_framework *fw,
return ret;
}
+static void pci_device_list_free(struct pci_device *head)
+{
+ struct pci_device *next;
+
+ while (head) {
+ next = head->next;
+ free(head);
+ head = next;
+ }
+}
+
int pcie_check_aspm_registers(fwts_framework *fw,
const fwts_log_level level)
{
@@ -212,8 +223,11 @@ int pcie_check_aspm_registers(fwts_framework *fw,
char *pEnd;
device = (struct pci_device *) calloc(1, sizeof(*device));
- if (device == NULL)
+ if (device == NULL) {
+ pci_device_list_free(head);
+ fwts_text_list_free(lspci_output);
return FWTS_ERROR;
+ }
device->bus = strtol(line, &pEnd, 16);
device->dev = strtol(pEnd + 1, &pEnd, 16);
@@ -226,6 +240,7 @@ int pcie_check_aspm_registers(fwts_framework *fw,
cur = device;
}
+ fwts_text_list_free(lspci_output);
for (cur = head; cur; cur = cur->next) {
int reg_loc = 0, reg_val = 0;
@@ -235,10 +250,13 @@ int pcie_check_aspm_registers(fwts_framework *fw,
fw->lspci, cur->bus, cur->dev, cur->func);
if (fwts_pipe_exec(command, &lspci_output) == FWTS_EXEC_ERROR) {
fwts_log_warning(fw, "Could not execute %s", command);
+ pci_device_list_free(head);
return FWTS_ERROR;
}
- if (lspci_output == NULL)
+ if (lspci_output == NULL) {
+ pci_device_list_free(head);
return FWTS_ERROR;
+ }
fwts_list_foreach(item, lspci_output) {
char *line = fwts_text_list_text(item);
@@ -253,6 +271,7 @@ int pcie_check_aspm_registers(fwts_framework *fw,
}
}
}
+ fwts_text_list_free(lspci_output);
}
/* Check aspm registers from the list of pci devices */
@@ -275,14 +294,7 @@ int pcie_check_aspm_registers(fwts_framework *fw,
}
}
- cur = head;
- while (cur != NULL) {
- device = cur->next;
- free(cur);
- cur = device;
- }
-
- fwts_text_list_free(lspci_output);
+ pci_device_list_free(head);
return ret;
}
--
1.7.9.5
More information about the fwts-devel
mailing list