summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid E. Box <david.e.box@linux.intel.com>2014-07-08 10:06:17 +0800
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2014-07-08 14:22:25 +0200
commitce5eb07339b9162812458ee611b6e7af7604a3e4 (patch)
tree71c9c03ab9035c2c21a72b4d619afabc54be718f
parente740304c7cf389b5d498bd86865fc82518d9ea1a (diff)
downloadop-kernel-dev-ce5eb07339b9162812458ee611b6e7af7604a3e4.zip
op-kernel-dev-ce5eb07339b9162812458ee611b6e7af7604a3e4.tar.gz
ACPICA: Utilities: Validate full RSDP header
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@linux.intel.com> Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Lv Zheng <lv.zheng@intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r--drivers/acpi/acpica/utfileio.c19
1 files 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 */
OpenPOWER on IntegriCloud