ACPICA: Fix wrong object length returned by acpi_ut_get_simple_object_size().
authorLv Zheng <lv.zheng@intel.com>
Thu, 31 Oct 2013 01:30:36 +0000 (09:30 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 31 Oct 2013 13:37:33 +0000 (14:37 +0100)
The object length returned by acpi_ut_get_simple_object_size() should
be rounded up to the closest word boundary.

This patch ports a fix from ACPICA upstream to Linux.

[rjw: Changelog]
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpica/utobject.c

index aa61f66ee861ed1de71fee8bb72d0e412627382c..cddb0ef5b9b75a1cfee09ecd4ee3cbef0c6febbb 100644 (file)
@@ -461,25 +461,28 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object,
 
        ACPI_FUNCTION_TRACE_PTR(ut_get_simple_object_size, internal_object);
 
+       /* Start with the length of the (external) Acpi object */
+
+       length = sizeof(union acpi_object);
+
+       /* A NULL object is allowed, can be a legal uninitialized package element */
+
+       if (!internal_object) {
        /*
-        * Handle a null object (Could be a uninitialized package
-        * element -- which is legal)
+                * Object is NULL, just return the length of union acpi_object
+                * (A NULL union acpi_object is an object of all zeroes.)
         */
-       if (!internal_object) {
-               *obj_length = sizeof(union acpi_object);
+               *obj_length = ACPI_ROUND_UP_TO_NATIVE_WORD(length);
                return_ACPI_STATUS(AE_OK);
        }
 
-       /* Start with the length of the Acpi object */
-
-       length = sizeof(union acpi_object);
+       /* A Namespace Node should never appear here */
 
        if (ACPI_GET_DESCRIPTOR_TYPE(internal_object) == ACPI_DESC_TYPE_NAMED) {
 
-               /* Object is a named object (reference), just return the length */
+               /* A namespace node should never get here */
 
-               *obj_length = ACPI_ROUND_UP_TO_NATIVE_WORD(length);
-               return_ACPI_STATUS(status);
+               return_ACPI_STATUS(AE_AML_INTERNAL);
        }
 
        /*