]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
platform/x86: alienware-wmi: fix kfree on potentially uninitialized pointer
authorColin Ian King <colin.king@canonical.com>
Sat, 30 Mar 2019 00:17:12 +0000 (00:17 +0000)
committerDarren Hart (VMware) <dvhart@infradead.org>
Tue, 16 Apr 2019 20:18:23 +0000 (13:18 -0700)
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>
drivers/platform/x86/alienware-wmi.c

index f10af5c383c551d7632d0e66b751792ae9dc7abd..c0d1555735cddcc7526ed211d70e14189b5bc950 100644 (file)
@@ -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;
-
 }
 
 /*