Commit 333b04ae authored by Alexey Starikovskiy's avatar Alexey Starikovskiy Committed by Len Brown

ACPICA: Fix for acpi_reallocate_root_table for incorrect root table copy

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: default avatarAlexey Starikovskiy <astarikovskiy@suse.de>
Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarLin Ming <ming.m.lin@intel.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent a7499bc8
...@@ -172,6 +172,7 @@ acpi_status acpi_reallocate_root_table(void) ...@@ -172,6 +172,7 @@ acpi_status acpi_reallocate_root_table(void)
{ {
struct acpi_table_desc *tables; struct acpi_table_desc *tables;
acpi_size new_size; acpi_size new_size;
acpi_size current_size;
ACPI_FUNCTION_TRACE(acpi_reallocate_root_table); ACPI_FUNCTION_TRACE(acpi_reallocate_root_table);
...@@ -183,9 +184,15 @@ acpi_status acpi_reallocate_root_table(void) ...@@ -183,9 +184,15 @@ acpi_status acpi_reallocate_root_table(void)
return_ACPI_STATUS(AE_SUPPORT); return_ACPI_STATUS(AE_SUPPORT);
} }
new_size = ((acpi_size) acpi_gbl_root_table_list.count + /*
ACPI_ROOT_TABLE_SIZE_INCREMENT) * * Get the current size of the root table and add the default
sizeof(struct acpi_table_desc); * 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 */ /* Create new array and copy the old array */
...@@ -194,10 +201,16 @@ acpi_status acpi_reallocate_root_table(void) ...@@ -194,10 +201,16 @@ acpi_status acpi_reallocate_root_table(void)
return_ACPI_STATUS(AE_NO_MEMORY); 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.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_gbl_root_table_list.flags =
ACPI_ROOT_ORIGIN_ALLOCATED | ACPI_ROOT_ALLOW_RESIZE; ACPI_ROOT_ORIGIN_ALLOCATED | ACPI_ROOT_ALLOW_RESIZE;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment