iommu/vt-d: Fix error handling in ANDD processing
authorDavid Woodhouse <David.Woodhouse@intel.com>
Tue, 1 Apr 2014 13:58:36 +0000 (14:58 +0100)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Tue, 1 Apr 2014 13:58:38 +0000 (14:58 +0100)
If we failed to find an ACPI device to correspond to an ANDD record, we
would fail to increment our pointer and would just process the same record
over and over again, with predictable results.

Turn it from a while() loop into a for() loop to let the 'continue' in
the error paths work correctly.

Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
drivers/iommu/dmar.c

index 142650e8297903e6904fd7ec32d57b6f9e784dc3..f445c10df8dfd2beb53b8fb4628d7094d0e17b5a 100644 (file)
@@ -662,10 +662,9 @@ static int __init dmar_acpi_dev_scope_init(void)
        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) {
+       for (andd = (void *)dmar_tbl + sizeof(struct acpi_table_dmar);
+            ((unsigned long)andd) < ((unsigned long)dmar_tbl) + dmar_tbl->length;
+            andd = ((void *)andd) + andd->header.length) {
                if (andd->header.type == ACPI_DMAR_TYPE_ANDD) {
                        acpi_handle h;
                        struct acpi_device *adev;
@@ -685,7 +684,6 @@ static int __init dmar_acpi_dev_scope_init(void)
                        }
                        dmar_acpi_insert_dev_scope(andd->device_number, adev);
                }
-               andd = ((void *)andd) + andd->header.length;
        }
        return 0;
 }