ACPICA: Add a table checksum verify for Load operator
authorBob Moore <robert.moore@intel.com>
Thu, 10 Apr 2008 15:06:39 +0000 (19:06 +0400)
committerLen Brown <len.brown@intel.com>
Tue, 22 Apr 2008 18:29:25 +0000 (14:29 -0400)
Added a table checksum verification for the Load operator, in
the case where the load is from a buffer.

http://www.acpica.org/bugzilla/show_bug.cgi?id=578

Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de>
Signed-off-by: Len Brown <len.brown@intel.com>
drivers/acpi/executer/exconfig.c
drivers/acpi/tables/tbutils.c

index a0f34b4..dbf1e6f 100644 (file)
@@ -275,6 +275,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
        struct acpi_table_desc table_desc;
        acpi_native_uint table_index;
        acpi_status status;
+       u32 length;
 
        ACPI_FUNCTION_TRACE(ex_load_op);
 
@@ -322,18 +323,35 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
                                  "Load from Buffer or Field %p %s\n", obj_desc,
                                  acpi_ut_get_object_type_name(obj_desc)));
 
+               length = obj_desc->buffer.length;
+
+               /* Must have at least an ACPI table header */
+
+               if (length < sizeof(struct acpi_table_header)) {
+                       return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
+               }
+
+               /* Validate checksum here. It won't get validated in tb_add_table */
+
+               status = acpi_tb_verify_checksum((struct acpi_table_header *)
+                                                obj_desc->buffer.pointer,
+                                                length);
+               if (ACPI_FAILURE(status)) {
+                       return_ACPI_STATUS(status);
+               }
+
                /*
                 * We need to copy the buffer since the original buffer could be
                 * changed or deleted in the future
                 */
-               table_desc.pointer = ACPI_ALLOCATE(obj_desc->buffer.length);
+               table_desc.pointer = ACPI_ALLOCATE(length);
                if (!table_desc.pointer) {
                        return_ACPI_STATUS(AE_NO_MEMORY);
                }
 
                ACPI_MEMCPY(table_desc.pointer, obj_desc->buffer.pointer,
-                           obj_desc->buffer.length);
-               table_desc.length = obj_desc->buffer.length;
+                           length);
+               table_desc.length = length;
                table_desc.flags = ACPI_TABLE_ORIGIN_ALLOCATED;
                break;
 
index 010f196..d04442f 100644 (file)
@@ -212,7 +212,7 @@ acpi_status acpi_tb_verify_checksum(struct acpi_table_header *table, u32 length)
 
        if (checksum) {
                ACPI_WARNING((AE_INFO,
-                             "Incorrect checksum in table [%4.4s] -  %2.2X, should be %2.2X",
+                             "Incorrect checksum in table [%4.4s] - %2.2X, should be %2.2X",
                              table->signature, table->checksum,
                              (u8) (table->checksum - checksum)));