Skip to content

Commit

Permalink
ACPICA: Fix for acpi_reallocate_root_table for incorrect root table copy
Browse files Browse the repository at this point in the history
When copying the root table to the new allocation, the length
used was incorrect. The new size was used instead of the current
table size, meaning too much data was copied.

Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de>
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
  • Loading branch information
Alexey Starikovskiy authored and Len Brown committed Apr 20, 2010
1 parent a7499bc commit 333b04a
Showing 1 changed file with 18 additions and 5 deletions.
23 changes: 18 additions & 5 deletions drivers/acpi/acpica/tbxface.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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 */

Expand All @@ -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;

Expand Down

0 comments on commit 333b04a

Please sign in to comment.