WMI: simplify handling of returned WMI blocks in parse_wdg()
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Thu, 26 Aug 2010 07:15:09 +0000 (00:15 -0700)
committerMatthew Garrett <mjg@redhat.com>
Thu, 21 Oct 2010 13:36:47 +0000 (09:36 -0400)
There is no reason why we allocate memory and copy data into an
intermediate buffer, it is not like we are working with data coming
from userspace.

Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Signed-off-by: Matthew Garrett <mjg@redhat.com>
drivers/platform/x86/wmi.c

index 81552bc..f6e85c8 100644 (file)
@@ -475,7 +475,7 @@ const struct acpi_buffer *in)
 }
 EXPORT_SYMBOL_GPL(wmi_set_block);
 
-static void wmi_dump_wdg(struct guid_block *g)
+static void wmi_dump_wdg(const struct guid_block *g)
 {
        char guid_string[37];
 
@@ -812,7 +812,7 @@ static acpi_status parse_wdg(acpi_handle handle)
 {
        struct acpi_buffer out = {ACPI_ALLOCATE_BUFFER, NULL};
        union acpi_object *obj;
-       struct guid_block *gblock;
+       const struct guid_block *gblock;
        struct wmi_block *wblock;
        char guid_string[37];
        acpi_status status;
@@ -832,14 +832,9 @@ static acpi_status parse_wdg(acpi_handle handle)
                goto out_free_pointer;
        }
 
+       gblock = (const struct guid_block *)obj->buffer.pointer;
        total = obj->buffer.length / sizeof(struct guid_block);
 
-       gblock = kmemdup(obj->buffer.pointer, obj->buffer.length, GFP_KERNEL);
-       if (!gblock) {
-               status = AE_NO_MEMORY;
-               goto out_free_pointer;
-       }
-
        for (i = 0; i < total; i++) {
                /*
                  Some WMI devices, like those for nVidia hooks, have a
@@ -860,7 +855,7 @@ static acpi_status parse_wdg(acpi_handle handle)
                wblock = kzalloc(sizeof(struct wmi_block), GFP_KERNEL);
                if (!wblock) {
                        status = AE_NO_MEMORY;
-                       goto out_free_gblock;
+                       goto out_free_pointer;
                }
 
                wblock->gblock = gblock[i];
@@ -872,8 +867,6 @@ static acpi_status parse_wdg(acpi_handle handle)
                list_add_tail(&wblock->list, &wmi_blocks.list);
        }
 
-out_free_gblock:
-       kfree(gblock);
 out_free_pointer:
        kfree(out.pointer);