Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Lv Zheng and committed by
Rafael J. Wysocki
04ba15aa 9b019b0f

+1 -29
-28
drivers/acpi/acpica/tbinstal.c
··· 222 222 (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); 223 223 224 224 if (reload) { 225 - /* 226 - * Validate the incoming table signature. 227 - * 228 - * 1) Originally, we checked the table signature for "SSDT" or "PSDT". 229 - * 2) We added support for OEMx tables, signature "OEM". 230 - * 3) Valid tables were encountered with a null signature, so we just 231 - * gave up on validating the signature, (05/2008). 232 - * 4) We encountered non-AML tables such as the MADT, which caused 233 - * interpreter errors and kernel faults. So now, we once again allow 234 - * only "SSDT", "OEMx", and now, also a null signature. (05/2011). 235 - */ 236 - if ((new_table_desc.signature.ascii[0] != 0x00) && 237 - (!ACPI_COMPARE_NAME 238 - (&new_table_desc.signature, ACPI_SIG_SSDT)) 239 - && (strncmp(new_table_desc.signature.ascii, "OEM", 3))) { 240 - ACPI_BIOS_ERROR((AE_INFO, 241 - "Table has invalid signature [%4.4s] (0x%8.8X), " 242 - "must be SSDT or OEMx", 243 - acpi_ut_valid_nameseg(new_table_desc. 244 - signature. 245 - ascii) ? 246 - new_table_desc.signature. 247 - ascii : "????", 248 - new_table_desc.signature.integer)); 249 - 250 - status = AE_BAD_SIGNATURE; 251 - goto unlock_and_exit; 252 - } 253 225 254 226 /* Check if table is already registered */ 255 227
+1 -1
drivers/acpi/acpica/tbxfload.c
··· 206 206 for (i = 0; i < acpi_gbl_root_table_list.current_table_count; ++i) { 207 207 table = &acpi_gbl_root_table_list.tables[i]; 208 208 209 - if (!acpi_gbl_root_table_list.tables[i].address || 209 + if (!table->address || 210 210 (!ACPI_COMPARE_NAME(table->signature.ascii, ACPI_SIG_SSDT) 211 211 && !ACPI_COMPARE_NAME(table->signature.ascii, 212 212 ACPI_SIG_PSDT)