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

Re: [Xen-devel] [PATCH] ACPI: fix APEI related table size checking


  • To: Jan Beulich <JBeulich@xxxxxxxx>, xen-devel <xen-devel@xxxxxxxxxxxxx>
  • From: Keir Fraser <keir.xen@xxxxxxxxx>
  • Date: Tue, 16 Oct 2012 16:12:19 +0100
  • Cc: ying.huang@xxxxxxxxx
  • Delivery-date: Tue, 16 Oct 2012 15:12:37 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xen.org>
  • Thread-index: Ac2rsKJZUuhBikxPC0CNAV4FlwAxZw==
  • Thread-topic: [Xen-devel] [PATCH] ACPI: fix APEI related table size checking

On 16/10/2012 15:46, "Jan Beulich" <JBeulich@xxxxxxxx> wrote:

> 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>

> --- 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



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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