ACPICA: Fix for acpi_reallocate_root_table for incorrect root table copy
[pandora-kernel.git] / drivers / acpi / acpica / tbxface.c
index 5217a61..684614d 100644 (file)
@@ -172,6 +172,7 @@ acpi_status acpi_reallocate_root_table(void)
 {
        struct acpi_table_desc *tables;
        acpi_size new_size;
+       acpi_size current_size;
 
        ACPI_FUNCTION_TRACE(acpi_reallocate_root_table);
 
@@ -183,9 +184,15 @@ acpi_status acpi_reallocate_root_table(void)
                return_ACPI_STATUS(AE_SUPPORT);
        }
 
-       new_size = ((acpi_size) acpi_gbl_root_table_list.count +
-                   ACPI_ROOT_TABLE_SIZE_INCREMENT) *
-           sizeof(struct acpi_table_desc);
+       /*
+        * Get the current size of the root table and add the default
+        * increment to create the new table size.
+        */
+       current_size = (acpi_size)
+           acpi_gbl_root_table_list.count * sizeof(struct acpi_table_desc);
+
+       new_size = current_size +
+           (ACPI_ROOT_TABLE_SIZE_INCREMENT * sizeof(struct acpi_table_desc));
 
        /* Create new array and copy the old array */
 
@@ -194,10 +201,16 @@ acpi_status acpi_reallocate_root_table(void)
                return_ACPI_STATUS(AE_NO_MEMORY);
        }
 
-       ACPI_MEMCPY(tables, acpi_gbl_root_table_list.tables, new_size);
+       ACPI_MEMCPY(tables, acpi_gbl_root_table_list.tables, current_size);
 
-       acpi_gbl_root_table_list.size = acpi_gbl_root_table_list.count;
+       /*
+        * Update the root table descriptor. The new size will be the current
+        * number of tables plus the increment, independent of the reserved
+        * size of the original table list.
+        */
        acpi_gbl_root_table_list.tables = tables;
+       acpi_gbl_root_table_list.size =
+           acpi_gbl_root_table_list.count + ACPI_ROOT_TABLE_SIZE_INCREMENT;
        acpi_gbl_root_table_list.flags =
            ACPI_ROOT_ORIGIN_ALLOCATED | ACPI_ROOT_ALLOW_RESIZE;