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

[Xen-changelog] [xen-unstable] ACPI: fix APEI related table size checking


  • To: xen-changelog@xxxxxxxxxxxxxxxxxxx
  • From: Xen patchbot-unstable <patchbot@xxxxxxx>
  • Date: Fri, 19 Oct 2012 22:11:07 +0000
  • Delivery-date: Fri, 19 Oct 2012 22:11:19 +0000
  • List-id: "Change log for Mercurial \(receive only\)" <xen-changelog.lists.xen.org>

# HG changeset patch
# User Huang Ying <ying.huang@xxxxxxxxx>
# Date 1350401196 -7200
# Node ID 4fc87c2f31a02c770655518c9e4d389302564f00
# Parent  c1c549c4fe9ebdc460cbf51e296edad157b6e518
ACPI: fix APEI related table size checking

On Huang Ying's machine:

erst_tab->header_length == sizeof(struct acpi_table_einj)

but Yinghai reported that on his machine,

erst_tab->header_length == sizeof(struct acpi_table_einj) -
sizeof(struct acpi_table_header)

To make erst table size checking code works on all systems, both
testing are treated as PASS.

Same situation applies to einj_tab->header_length, so corresponding
table size checking is changed in similar way too.

Originally-by: Yinghai Lu <yinghai@xxxxxxxxxx>
Signed-off-by: Huang Ying <ying.huang@xxxxxxxxx>

- use switch() for better readability
- add comment explaining why a formally invalid size it also being
  accepted
- check erst_tab->header.length before even looking at
  erst_tab->header_length
- prefer sizeof(*erst_tab) over sizeof(struct acpi_table_erst)

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Acked-by: Keir Fraser <keir@xxxxxxx>
Committed-by: Jan Beulich <jbeulich@xxxxxxxx>
---


diff -r c1c549c4fe9e -r 4fc87c2f31a0 xen/drivers/acpi/apei/erst.c
--- a/xen/drivers/acpi/apei/erst.c      Mon Oct 15 16:51:44 2012 +0100
+++ b/xen/drivers/acpi/apei/erst.c      Tue Oct 16 17:26:36 2012 +0200
@@ -715,12 +715,23 @@ int erst_clear(u64 record_id)
 
 static int __init erst_check_table(struct acpi_table_erst *erst_tab)
 {
-       if (erst_tab->header_length != sizeof(struct acpi_table_erst))
+       if (erst_tab->header.length < sizeof(*erst_tab))
                return -EINVAL;
-       if (erst_tab->header.length < sizeof(struct acpi_table_erst))
+
+       switch (erst_tab->header_length) {
+       case sizeof(*erst_tab) - sizeof(erst_tab->header):
+       /*
+        * While invalid per specification, there are (early?) systems
+        * indicating the full header size here, so accept that value too.
+        */
+       case sizeof(*erst_tab):
+               break;
+       default:
                return -EINVAL;
+       }
+
        if (erst_tab->entries !=
-           (erst_tab->header.length - sizeof(struct acpi_table_erst)) /
+           (erst_tab->header.length - sizeof(*erst_tab)) /
            sizeof(struct acpi_erst_entry))
                return -EINVAL;
 

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.