iommu/vt-d: Check for NULL pointer in dmar_acpi_dev_scope_init()
authorJoerg Roedel <joro@8bytes.org>
Tue, 25 Mar 2014 19:16:40 +0000 (20:16 +0100)
committerJoerg Roedel <joro@8bytes.org>
Tue, 25 Mar 2014 19:36:09 +0000 (20:36 +0100)
When ir_dev_scope_init() is called via a rootfs initcall it
will check for irq_remapping_enabled before it calls
(indirectly) into dmar_acpi_dev_scope_init() which uses the
dmar_tbl pointer without any checks.

The AMD IOMMU driver also sets the irq_remapping_enabled
flag which causes the dmar_acpi_dev_scope_init() function to
be called on systems with AMD IOMMU hardware too, causing a
boot-time kernel crash.

Signed-off-by: Joerg Roedel <joro@8bytes.org>
drivers/iommu/dmar.c

index 56e1c79dc77fd31bc9ad031df74a5eaecd73fc0b..e531a2b07207ef7b01c233370352aa68266879c3 100644 (file)
@@ -657,7 +657,12 @@ static void __init dmar_acpi_insert_dev_scope(u8 device_number,
 
 static int __init dmar_acpi_dev_scope_init(void)
 {
-       struct acpi_dmar_andd *andd = (void *)dmar_tbl + sizeof(struct acpi_table_dmar);
+       struct acpi_dmar_andd *andd;
+
+       if (dmar_tbl == NULL)
+               return -ENODEV;
+
+       andd = (void *)dmar_tbl + sizeof(struct acpi_table_dmar);
 
        while (((unsigned long)andd) <
               ((unsigned long)dmar_tbl) + dmar_tbl->length) {