lkml.org 
[lkml]   [2020]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 314/639] platform/x86: alienware-wmi: fix kfree on potentially uninitialized pointer
    Date
    From: Colin Ian King <colin.king@canonical.com>

    [ Upstream commit 98e2630284ab741804bd0713e932e725466f2f84 ]

    Currently the kfree of output.pointer can be potentially freeing
    an uninitalized pointer in the case where out_data is NULL. Fix this
    by reworking the case where out_data is not-null to perform the
    ACPI status check and also the kfree of outpoint.pointer in one block
    and hence ensuring the pointer is only freed when it has been used.

    Also replace the if (ptr != NULL) idiom with just if (ptr).

    Fixes: ff0e9f26288d ("platform/x86: alienware-wmi: Correct a memory leak")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Signed-off-by: Darren Hart (VMware) <dvhart@infradead.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/platform/x86/alienware-wmi.c | 17 ++++++++---------
    1 file changed, 8 insertions(+), 9 deletions(-)

    diff --git a/drivers/platform/x86/alienware-wmi.c b/drivers/platform/x86/alienware-wmi.c
    index f10af5c383c55..c0d1555735cdd 100644
    --- a/drivers/platform/x86/alienware-wmi.c
    +++ b/drivers/platform/x86/alienware-wmi.c
    @@ -522,23 +522,22 @@ static acpi_status alienware_wmax_command(struct wmax_basic_args *in_args,

    input.length = (acpi_size) sizeof(*in_args);
    input.pointer = in_args;
    - if (out_data != NULL) {
    + if (out_data) {
    output.length = ACPI_ALLOCATE_BUFFER;
    output.pointer = NULL;
    status = wmi_evaluate_method(WMAX_CONTROL_GUID, 0,
    command, &input, &output);
    - } else
    + if (ACPI_SUCCESS(status)) {
    + obj = (union acpi_object *)output.pointer;
    + if (obj && obj->type == ACPI_TYPE_INTEGER)
    + *out_data = (u32)obj->integer.value;
    + }
    + kfree(output.pointer);
    + } else {
    status = wmi_evaluate_method(WMAX_CONTROL_GUID, 0,
    command, &input, NULL);
    -
    - if (ACPI_SUCCESS(status) && out_data != NULL) {
    - obj = (union acpi_object *)output.pointer;
    - if (obj && obj->type == ACPI_TYPE_INTEGER)
    - *out_data = (u32) obj->integer.value;
    }
    - kfree(output.pointer);
    return status;
    -
    }

    /*
    --
    2.20.1


    \
     
     \ /
      Last update: 2020-01-24 12:18    [W:2.281 / U:3.492 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site