mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-21 19:53:59 +08:00
ACPICA: Tables: Do not validate signature for dynamic table load
ACPICA commit d3c944f2cdc8c7e847b7942b1864f285189f7bce Windows seems to allow arbitrary table signatures for Load/load_table opcodes: ACPI BIOS Error (bug): Table has invalid signature [PRAD] (0x44415250) So this patch removes dynamic load signature checks. However we need to find a way to avoid table loading against tables like MADT. This is not covered by this commit. This Windows behavior has been validated on link #1. An end user bug report can also be found on link #2. This patch also includes simple cleanup for static load signature check code. Reported by Ye Xiaolong, Fixed by Lv Zheng. Link: https://github.com/acpica/acpica/commit/d3c944f2 Link: https://github.com/acpica/acpica/pull/121 [#1] Link: https://bugzilla.kernel.org/show_bug.cgi?id=118601 [#2] Reported-by: Ye Xiaolong <xiaolong.ye@intel.com> Reported-by: Olga Uhina <olga.uhina@gmail.com> Signed-off-by: Lv Zheng <lv.zheng@intel.com> Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
9b019b0f67
commit
04ba15aa55
@ -222,34 +222,6 @@ acpi_tb_install_standard_table(acpi_physical_address address,
|
|||||||
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
|
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
|
||||||
|
|
||||||
if (reload) {
|
if (reload) {
|
||||||
/*
|
|
||||||
* Validate the incoming table signature.
|
|
||||||
*
|
|
||||||
* 1) Originally, we checked the table signature for "SSDT" or "PSDT".
|
|
||||||
* 2) We added support for OEMx tables, signature "OEM".
|
|
||||||
* 3) Valid tables were encountered with a null signature, so we just
|
|
||||||
* gave up on validating the signature, (05/2008).
|
|
||||||
* 4) We encountered non-AML tables such as the MADT, which caused
|
|
||||||
* interpreter errors and kernel faults. So now, we once again allow
|
|
||||||
* only "SSDT", "OEMx", and now, also a null signature. (05/2011).
|
|
||||||
*/
|
|
||||||
if ((new_table_desc.signature.ascii[0] != 0x00) &&
|
|
||||||
(!ACPI_COMPARE_NAME
|
|
||||||
(&new_table_desc.signature, ACPI_SIG_SSDT))
|
|
||||||
&& (strncmp(new_table_desc.signature.ascii, "OEM", 3))) {
|
|
||||||
ACPI_BIOS_ERROR((AE_INFO,
|
|
||||||
"Table has invalid signature [%4.4s] (0x%8.8X), "
|
|
||||||
"must be SSDT or OEMx",
|
|
||||||
acpi_ut_valid_nameseg(new_table_desc.
|
|
||||||
signature.
|
|
||||||
ascii) ?
|
|
||||||
new_table_desc.signature.
|
|
||||||
ascii : "????",
|
|
||||||
new_table_desc.signature.integer));
|
|
||||||
|
|
||||||
status = AE_BAD_SIGNATURE;
|
|
||||||
goto unlock_and_exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check if table is already registered */
|
/* Check if table is already registered */
|
||||||
|
|
||||||
|
@ -206,7 +206,7 @@ acpi_status acpi_tb_load_namespace(void)
|
|||||||
for (i = 0; i < acpi_gbl_root_table_list.current_table_count; ++i) {
|
for (i = 0; i < acpi_gbl_root_table_list.current_table_count; ++i) {
|
||||||
table = &acpi_gbl_root_table_list.tables[i];
|
table = &acpi_gbl_root_table_list.tables[i];
|
||||||
|
|
||||||
if (!acpi_gbl_root_table_list.tables[i].address ||
|
if (!table->address ||
|
||||||
(!ACPI_COMPARE_NAME(table->signature.ascii, ACPI_SIG_SSDT)
|
(!ACPI_COMPARE_NAME(table->signature.ascii, ACPI_SIG_SSDT)
|
||||||
&& !ACPI_COMPARE_NAME(table->signature.ascii,
|
&& !ACPI_COMPARE_NAME(table->signature.ascii,
|
||||||
ACPI_SIG_PSDT)
|
ACPI_SIG_PSDT)
|
||||||
|
Loading…
Reference in New Issue
Block a user