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

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



commit 2328ed01762e4f2023bddda3de323de5311c813c
Author:     Huang Ying <ying.huang@xxxxxxxxx>
AuthorDate: Tue Apr 2 11:02:30 2013 +0200
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Tue Apr 2 11:02:30 2013 +0200

    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>
    master changeset: 915ef37d7cc8fcac5b37eb0b40c693754fcd12ab
    master date: 2012-10-16 17:26:36 +0200
---
 xen/drivers/acpi/apei/erst.c |   17 ++++++++++++++---
 1 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/xen/drivers/acpi/apei/erst.c b/xen/drivers/acpi/apei/erst.c
index 1e420c5..71db9fa 100644
--- a/xen/drivers/acpi/apei/erst.c
+++ b/xen/drivers/acpi/apei/erst.c
@@ -764,12 +764,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;
 
--
generated by git-patchbot for /home/xen/git/xen.git#stable-4.2

_______________________________________________
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®.