Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d48dc067 authored by Lv Zheng's avatar Lv Zheng Committed by Rafael J. Wysocki
Browse files

ACPICA: Tables: Fix invalid pointer accesses in acpi_tb_parse_root_table().

Linux XSDT validation mechanism backport has introduced a regreession:
  Commit: 671cc68d
  Subject: ACPICA: Back port and refine validation of the XSDT root table.
There is a pointer still accessed after unmapping.

This patch fixes this issue.  Lv Zheng.

Fixes: 671cc68d (ACPICA: Back port and refine validation of the XSDT root table.)
References: https://bugzilla.kernel.org/show_bug.cgi?id=73911
References: https://bugs.archlinux.org/task/39811


Signed-off-by: default avatarLv Zheng <lv.zheng@intel.com>
Reported-and-tested-by: default avatarBruce Chiarelli <mano155@gmail.com>
Reported-and-tested-by: default avatarSpyros Stathopoulos <spystath@gmail.com>
Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Cc: 3.14+ <stable@vger.kernel.org> # 3.14+
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 89ca3b88
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -461,6 +461,7 @@ acpi_status __init acpi_tb_parse_root_table(acpi_physical_address rsdp_address)
	u32 table_count;
	struct acpi_table_header *table;
	acpi_physical_address address;
	acpi_physical_address rsdt_address;
	u32 length;
	u8 *table_entry;
	acpi_status status;
@@ -488,11 +489,14 @@ acpi_status __init acpi_tb_parse_root_table(acpi_physical_address rsdp_address)
		 * as per the ACPI specification.
		 */
		address = (acpi_physical_address) rsdp->xsdt_physical_address;
		rsdt_address =
		    (acpi_physical_address) rsdp->rsdt_physical_address;
		table_entry_size = ACPI_XSDT_ENTRY_SIZE;
	} else {
		/* Root table is an RSDT (32-bit physical addresses) */

		address = (acpi_physical_address) rsdp->rsdt_physical_address;
		rsdt_address = address;
		table_entry_size = ACPI_RSDT_ENTRY_SIZE;
	}

@@ -515,8 +519,7 @@ acpi_status __init acpi_tb_parse_root_table(acpi_physical_address rsdp_address)

			/* Fall back to the RSDT */

			address =
			    (acpi_physical_address) rsdp->rsdt_physical_address;
			address = rsdt_address;
			table_entry_size = ACPI_RSDT_ENTRY_SIZE;
		}
	}