| From df45c712d1f4ef37714245fb75de726f4ca2bf8d Mon Sep 17 00:00:00 2001 |
| From: Jiang Liu <jiang.liu@linux.intel.com> |
| Date: Thu, 19 Dec 2013 20:38:15 +0800 |
| Subject: ACPI / TPM: fix memory leak when walking ACPI namespace |
| |
| From: Jiang Liu <jiang.liu@linux.intel.com> |
| |
| commit df45c712d1f4ef37714245fb75de726f4ca2bf8d upstream. |
| |
| In function ppi_callback(), memory allocated by acpi_get_name() will get |
| leaked when current device isn't the desired TPM device, so fix the |
| memory leak. |
| |
| Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com> |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/char/tpm/tpm_ppi.c | 15 +++++++++------ |
| 1 file changed, 9 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/char/tpm/tpm_ppi.c |
| +++ b/drivers/char/tpm/tpm_ppi.c |
| @@ -27,15 +27,18 @@ static char *tpm_device_name = "TPM"; |
| static acpi_status ppi_callback(acpi_handle handle, u32 level, void *context, |
| void **return_value) |
| { |
| - acpi_status status; |
| + acpi_status status = AE_OK; |
| struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; |
| - status = acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer); |
| - if (strstr(buffer.pointer, context) != NULL) { |
| - *return_value = handle; |
| + |
| + if (ACPI_SUCCESS(acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer))) { |
| + if (strstr(buffer.pointer, context) != NULL) { |
| + *return_value = handle; |
| + status = AE_CTRL_TERMINATE; |
| + } |
| kfree(buffer.pointer); |
| - return AE_CTRL_TERMINATE; |
| } |
| - return AE_OK; |
| + |
| + return status; |
| } |
| |
| static inline void ppi_assign_params(union acpi_object params[4], |