diff options
| author | Jiang Liu <jiang.liu@linux.intel.com> | 2013-12-19 07:38:15 -0500 |
|---|---|---|
| committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2014-01-05 09:54:21 -0500 |
| commit | df45c712d1f4ef37714245fb75de726f4ca2bf8d (patch) | |
| tree | 17b2e6481e68d95ff8b4a27931062c13f2621bd5 | |
| parent | d6e0a2dd12f4067a5bcefb8bbd8ddbeff800afbc (diff) | |
ACPI / TPM: fix memory leak when walking ACPI namespace
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>
Cc: All applicable <stable@vger.kernel.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
| -rw-r--r-- | drivers/char/tpm/tpm_ppi.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/drivers/char/tpm/tpm_ppi.c b/drivers/char/tpm/tpm_ppi.c index 8e562dc65601..e1f3337a0cf9 100644 --- a/drivers/char/tpm/tpm_ppi.c +++ b/drivers/char/tpm/tpm_ppi.c | |||
| @@ -27,15 +27,18 @@ static char *tpm_device_name = "TPM"; | |||
| 27 | static acpi_status ppi_callback(acpi_handle handle, u32 level, void *context, | 27 | static acpi_status ppi_callback(acpi_handle handle, u32 level, void *context, |
| 28 | void **return_value) | 28 | void **return_value) |
| 29 | { | 29 | { |
| 30 | acpi_status status; | 30 | acpi_status status = AE_OK; |
| 31 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; | 31 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; |
| 32 | status = acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer); | 32 | |
| 33 | if (strstr(buffer.pointer, context) != NULL) { | 33 | if (ACPI_SUCCESS(acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer))) { |
| 34 | *return_value = handle; | 34 | if (strstr(buffer.pointer, context) != NULL) { |
| 35 | *return_value = handle; | ||
| 36 | status = AE_CTRL_TERMINATE; | ||
| 37 | } | ||
| 35 | kfree(buffer.pointer); | 38 | kfree(buffer.pointer); |
| 36 | return AE_CTRL_TERMINATE; | ||
| 37 | } | 39 | } |
| 38 | return AE_OK; | 40 | |
| 41 | return status; | ||
| 39 | } | 42 | } |
| 40 | 43 | ||
| 41 | static inline void ppi_assign_params(union acpi_object params[4], | 44 | static inline void ppi_assign_params(union acpi_object params[4], |
