acer-wmi: fix memory leaks in wmab_execute error path
Subsystems (2)
PATCH 1/1 acer-wmi: fix memory leaks in wmab_execute error path
When acpi_evaluate_object() is passed ACPI_ALLOCATE_BUFFER, the caller must kfree the returned buffer if AE_OK is returned.
Call Trace:
wmab_execute
-> wmi_evaluate_method
-> acpi_evaluate_objectThus if callers of wmab_execute() pass ACPI_ALLOCATE_BUFFER, the return buffer must be kfreed if wmab_execute return AE_OK.
Signed-off-by Axel Lin <[email protected]>
--- drivers/platform/x86/acer-wmi.c | 13 ++++++++++++- 1 files changed, 12 insertions(+), 1 deletions(-)
drivers/platform/x86/acer-wmi.c +12 -1
@@ -555,6 +555,7 @@ static acpi_status AMW0_find_mailled(void) obj->buffer.length == sizeof(struct wmab_ret)) { ret = *((struct wmab_ret *) obj->buffer.pointer); } else { +kfree (out.pointer);return AE_ERROR ; }
@@ -598,6 +599,7 @@ static acpi_status AMW0_set_capabilities(void) obj->buffer.length == sizeof(struct wmab_ret)) { ret = *((struct wmab_ret *) obj->buffer.pointer); } else { +kfree (out.pointer);return AE_ERROR ; }
@@ -607,15 +609,24 @@ static acpi_status AMW0_set_capabilities(void) args.ebx =2 <<8 ; args.ebx |=ACER_AMW0_BLUETOOTH_MASK ; +/* +* It's ok to use existing buffer for next wmab_execute call. +* But we need to kfree(out.pointer) if next wmab_execute call +* returns AE_BUFFER_OVERFLOW. +*/ status =wmab_execute (&args, &out); -if (ACPI_FAILURE (status)) +if (ACPI_FAILURE (status)) { +if (status ==AE_BUFFER_OVERFLOW ) +kfree (out.pointer);return status; + } obj = (union acpi_object *) out.pointer;if (obj && obj->type ==ACPI_TYPE_BUFFER && obj->buffer.length ==sizeof (struct wmab_ret )) { ret = *((struct wmab_ret *) obj->buffer.pointer); }else { +kfree (out.pointer);return AE_ERROR ; }
Signature · 1 line
1.5.4.3
Quoted 8 lines · On Friday 09 July 2010 04:51:15 Axel Lin wrote:
When
acpi_evaluate_object()is passedACPI_ALLOCATE_BUFFER, the caller must kfree the returned buffer ifAE_OKis returned.Call Trace: wmab_execute -> wmi_evaluate_method -> acpi_evaluate_object
Quoted 4 lines
Thus if callers of
wmab_execute()passACPI_ALLOCATE_BUFFER, the return buffer must be kfreed ifwmab_executereturnAE_OK.Signed-off-by Axel Lin <[email protected]>
Acked-by Carlos Corbacho <[email protected]>
Signature · 3 lines
E-Mail: [email protected] Web: strangeworlds.co.uk GPG Key ID: 0x23EE722D