|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] ACPI: fix APEI related table size checking
>>> On 17.10.12 at 08:49, Huang Ying <ying.huang@xxxxxxxxx> wrote:
> On Tue, 2012-10-16 at 15:46 +0100, Jan Beulich wrote:
>> On Huang Ying's machine:
>>
>> erst_tab->header_length == sizeof(struct acpi_table_einj)
> ~~~~ ~~~~
>
> Typo?
Your typo: I copied the Linux commit message verbatim, to make
it possible to match the two commits. The adjustments done in
the actual patch eliminate the copy-n-paste mistake corrected by
Linux commit 7ed28f2ed43ece424ff2fa4dedac7928bb37a23a.
Jan
>> 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>
>>
>> --- a/xen/drivers/acpi/apei/erst.c
>> +++ b/xen/drivers/acpi/apei/erst.c
>> @@ -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-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |