[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] ACPI: fix APEI related table size checking
# 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |