[PATCH] pci: aspm: free memory from lists

Alex Hung alex.hung at canonical.com
Wed May 16 02:46:12 UTC 2012


On 05/16/2012 03:02 AM, Colin King wrote:
> 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;
>   }

Acked-by: Alex Hung <alex.hung at canonical.com>




More information about the fwts-devel mailing list