WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

Re: [Xen-devel] Xen 4.0.0-rc7 problem/hang with vt-d DMAR parsing

Jan Beulich wrote:
Weidong Han <weidong.han@xxxxxxxxx> 24.03.10 10:02 >>>
it cannot check entry_header->length < sizeof(struct acpi_table_XXX), which is not the actual size in acpi table.

I don't follow here: Minimally checking against
sizeof(struct acpi_dmar_entry_header) should be possible. But I can't
even see why checking for sizeof(struct acpi_table_XXX) in the
individual case statements can't be done.

Jan
Re-checked the code. You're right. Updated the patch to check with sizeof(struct acpi_table_XXX).

Idea-by: Jan Beulich <jbeulich@xxxxxxxxxx <mailto:jbeulich@xxxxxxxxxx>>
Signed-off-by: Weidong Han <weidong.han@xxxxxxxxx>

diff -r a4eac162dcb9 xen/drivers/passthrough/vtd/dmar.c
--- a/xen/drivers/passthrough/vtd/dmar.c    Thu Mar 25 01:05:03 2010 +0800
+++ b/xen/drivers/passthrough/vtd/dmar.c    Thu Mar 25 03:53:21 2010 +0800
@@ -659,6 +659,23 @@ static int __init acpi_parse_dmar(struct
    while ( ((unsigned long)entry_header) <
            (((unsigned long)dmar) + table->length) )
    {
+        /*
+         * entry_header length should not smaller than size of
+         * any acpi dmar structures. also avoid endless looping
+         * when the lenght is 0 on some bad BIOSs
+         */
+        if ( entry_header->length < sizeof(struct acpi_table_drhd) &&
+             entry_header->length < sizeof(struct acpi_table_rmrr) &&
+             entry_header->length < sizeof(struct acpi_table_atsr) &&
+             entry_header->length < sizeof(struct acpi_table_rhsa) )
+        {
+            dprintk(XENLOG_WARNING VTDPREFIX,
+                    "Invalid entry_header length: 0x%x\n",
+                    entry_header->length);
+            ret = -EINVAL;
+            break;
+        }
+
        switch ( entry_header->type )
        {
        case ACPI_DMAR_DRHD:



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>