Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7713ec06 authored by David Woodhouse's avatar David Woodhouse
Browse files

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: default avatarDavid Woodhouse <David.Woodhouse@intel.com>
parent 14d40569
Loading
Loading
Loading
Loading
+3 −5
Original line number Diff line number Diff line
@@ -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;
}