[PATCH 05/25] ACPICA: Utilities: Validate full RSDP header

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: "David E. Box" <david.e.box@xxxxxxxxxxxxxxx>

Implement proper RSDP validation in acpi_ut_read_table(). Prevents a segmentation
fault that can occur if a user passes the wrong file to iasl.

This patch is only useful for iasl, which is not shipped in the Linux
kernel.
After the new table reading utility functions are well tested, acpidump can
also switch to use the generic acpi_ut_read_table_xxx() APIs. Currently
this patch is no-op as acpidump does not link to the new APIs.

Signed-off-by: David E. Box <david.e.box@xxxxxxxxxxxxxxx>
Signed-off-by: Bob Moore <robert.moore@xxxxxxxxx>
Signed-off-by: Lv Zheng <lv.zheng@xxxxxxxxx>
---
 drivers/acpi/acpica/utfileio.c |   19 +++++++------------
 1 file changed, 7 insertions(+), 12 deletions(-)

diff --git a/drivers/acpi/acpica/utfileio.c b/drivers/acpi/acpica/utfileio.c
index c8f6359..bdf9914 100644
--- a/drivers/acpi/acpica/utfileio.c
+++ b/drivers/acpi/acpica/utfileio.c
@@ -150,6 +150,7 @@ acpi_ut_read_table(FILE * fp,
 	acpi_status status;
 	u32 file_size;
 	u8 standard_header = TRUE;
+	s32 count;
 
 	/* Get the file size */
 
@@ -164,27 +165,21 @@ acpi_ut_read_table(FILE * fp,
 
 	/* Read the signature */
 
-	if (fread(&table_header, 1, 4, fp) != 4) {
-		acpi_os_printf("Could not read the table signature\n");
+	fseek(fp, 0, SEEK_SET);
+
+	count = fread(&table_header, 1, sizeof(struct acpi_table_header), fp);
+	if (count != sizeof(struct acpi_table_header)) {
+		acpi_os_printf("Could not read the table header\n");
 		return (AE_BAD_HEADER);
 	}
 
-	fseek(fp, 0, SEEK_SET);
-
 	/* The RSDP table does not have standard ACPI header */
 
-	if (ACPI_COMPARE_NAME(table_header.signature, "RSD ")) {
+	if (ACPI_VALIDATE_RSDP_SIG(table_header.signature)) {
 		*table_length = file_size;
 		standard_header = FALSE;
 	} else {
-		/* Read the table header */
 
-		if (fread
-		    (&table_header, 1, sizeof(struct acpi_table_header),
-		     fp) != sizeof(struct acpi_table_header)) {
-			acpi_os_printf("Could not read the table header\n");
-			return (AE_BAD_HEADER);
-		}
 #if 0
 		/* Validate the table header/length */
 
-- 
1.7.10

--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux