From 7713ec066ae8adc49dd8daa02a73e6b60af6ee5f Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Tue, 1 Apr 2014 14:58:36 +0100 Subject: iommu/vt-d: Fix error handling in ANDD processing 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 --- drivers/iommu/dmar.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'drivers') diff --git a/drivers/iommu/dmar.c b/drivers/iommu/dmar.c index 142650e82979..f445c10df8df 100644 --- a/drivers/iommu/dmar.c +++ b/drivers/iommu/dmar.c @@ -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; } -- cgit v1.2.3