f9bc831
Bugzilla: 1090746
f9bc831
Upstream-status: Queued for 3.15 and CC'd to stable
f9bc831
f9bc831
From 2bb09843fc720389082ce7834b2716254bdf6c2d Mon Sep 17 00:00:00 2001
f9bc831
Message-Id: <2bb09843fc720389082ce7834b2716254bdf6c2d.1397794898.git.lv.zheng@intel.com>
f9bc831
From: Lv Zheng <lv.zheng@intel.com>
f9bc831
Date: Fri, 18 Apr 2014 12:21:34 +0800
f9bc831
Subject: [PATCH] ACPICA: Tables: Fix a bad pointer issue in
f9bc831
 acpi_tb_parse_root_table().
f9bc831
f9bc831
The following is a linuxizing generation of the ACPICA commit to back ports
f9bc831
Linux XSDT validation mechanism to ACPICA:
f9bc831
  Commit: 671cc68dc61f029d44b43a681356078e02d8dab8
f9bc831
  Subject: ACPICA: Back port and refine validation of the XSDT root table.
f9bc831
It triggers a regression that a pointer is still used after unmapping.
f9bc831
f9bc831
This patch fixes this issue. Lv Zheng.
f9bc831
f9bc831
Buglink: https://bugzilla.kernel.org/show_bug.cgi?id=73911
f9bc831
Buglink: https://bugs.archlinux.org/task/39811
f9bc831
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
f9bc831
Reported-and-tested-by: Bruce Chiarelli <mano155@gmail.com>
f9bc831
Reported-and-tested-by: Spyros Stathopoulos <spystath@gmail.com>
f9bc831
Cc: <stable@vger.kernel.org> # 3.14.x: 671cc68: ACPICA: Back port and refine validation of the XSDT root table.
f9bc831
---
f9bc831
 drivers/acpi/acpica/tbutils.c |    6 ++++--
f9bc831
 1 file changed, 4 insertions(+), 2 deletions(-)
f9bc831
f9bc831
diff --git a/drivers/acpi/acpica/tbutils.c b/drivers/acpi/acpica/tbutils.c
f9bc831
index 6412d3c..7285871 100644
f9bc831
--- a/drivers/acpi/acpica/tbutils.c
f9bc831
+++ b/drivers/acpi/acpica/tbutils.c
f9bc831
@@ -461,6 +461,7 @@ acpi_status __init acpi_tb_parse_root_table(acpi_physical_address rsdp_address)
f9bc831
 	u32 table_count;
f9bc831
 	struct acpi_table_header *table;
f9bc831
 	acpi_physical_address address;
f9bc831
+	acpi_physical_address rsdt_address;
f9bc831
 	u32 length;
f9bc831
 	u8 *table_entry;
f9bc831
 	acpi_status status;
f9bc831
@@ -488,11 +489,13 @@ acpi_status __init acpi_tb_parse_root_table(acpi_physical_address rsdp_address)
f9bc831
 		 * as per the ACPI specification.
f9bc831
 		 */
f9bc831
 		address = (acpi_physical_address) rsdp->xsdt_physical_address;
f9bc831
+		rsdt_address = (acpi_physical_address) rsdp->rsdt_physical_address;
f9bc831
 		table_entry_size = ACPI_XSDT_ENTRY_SIZE;
f9bc831
 	} else {
f9bc831
 		/* Root table is an RSDT (32-bit physical addresses) */
f9bc831
 
f9bc831
 		address = (acpi_physical_address) rsdp->rsdt_physical_address;
f9bc831
+		rsdt_address = address;
f9bc831
 		table_entry_size = ACPI_RSDT_ENTRY_SIZE;
f9bc831
 	}
f9bc831
 
f9bc831
@@ -515,8 +518,7 @@ acpi_status __init acpi_tb_parse_root_table(acpi_physical_address rsdp_address)
f9bc831
 
f9bc831
 			/* Fall back to the RSDT */
f9bc831
 
f9bc831
-			address =
f9bc831
-			    (acpi_physical_address) rsdp->rsdt_physical_address;
f9bc831
+			address = rsdt_address;
f9bc831
 			table_entry_size = ACPI_RSDT_ENTRY_SIZE;
f9bc831
 		}
f9bc831
 	}
f9bc831
-- 
f9bc831
1.7.10
f9bc831