diff options
author | Axel Lin <axel.lin@gmail.com> | 2010-06-27 21:30:45 -0400 |
---|---|---|
committer | Matthew Garrett <mjg@redhat.com> | 2010-08-03 09:48:51 -0400 |
commit | 1492616a434dae1908d0da2d6ee6605ca5a77e6f (patch) | |
tree | 4bab4bca46acbf15e242e6663b313e05f1d1be06 | |
parent | d5164dbf1f651d1e955b158fb70a9c844cc91cd1 (diff) |
wmi: fix a memory leak in wmi_notify_debug
When acpi_evaluate_object() is passed ACPI_ALLOCATE_BUFFER,
the caller must kfree the returned buffer if AE_OK is returned.
The callers of wmi_get_event_data() pass ACPI_ALLOCATE_BUFFER,
and thus must check its return value before accessing
or kfree() on the buffer.
This patch adds return value checking for wmi_get_event_data()
and adds a missing kfree(obj) in the end of wmi_notify_debug
Signed-off-by: Axel Lin <axel.lin@gmail.com>
Acked-by: Thomas Renninger <trenn@suse.de>
Signed-off-by: Matthew Garrett <mjg@redhat.com>
-rw-r--r-- | drivers/platform/x86/wmi.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c index 582b5cdd3f43..6c15720be6a4 100644 --- a/drivers/platform/x86/wmi.c +++ b/drivers/platform/x86/wmi.c | |||
@@ -518,8 +518,13 @@ static void wmi_notify_debug(u32 value, void *context) | |||
518 | { | 518 | { |
519 | struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL }; | 519 | struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL }; |
520 | union acpi_object *obj; | 520 | union acpi_object *obj; |
521 | acpi_status status; | ||
521 | 522 | ||
522 | wmi_get_event_data(value, &response); | 523 | status = wmi_get_event_data(value, &response); |
524 | if (status != AE_OK) { | ||
525 | printk(KERN_INFO "wmi: bad event status 0x%x\n", status); | ||
526 | return; | ||
527 | } | ||
523 | 528 | ||
524 | obj = (union acpi_object *)response.pointer; | 529 | obj = (union acpi_object *)response.pointer; |
525 | 530 | ||
@@ -543,6 +548,7 @@ static void wmi_notify_debug(u32 value, void *context) | |||
543 | default: | 548 | default: |
544 | printk("object type 0x%X\n", obj->type); | 549 | printk("object type 0x%X\n", obj->type); |
545 | } | 550 | } |
551 | kfree(obj); | ||
546 | } | 552 | } |
547 | 553 | ||
548 | /** | 554 | /** |