iASL/disassembler: avoid infinite loop on bad ACPI tables.

Check for zero-length subtables when disassembling ACPI tables.
Also fixes a couple of errors where a full 16-bit table type
was not extracted from the input properly.
This commit is contained in:
Robert Moore 2008-08-14 13:52:26 -07:00 committed by Ming M. Lin
parent f2d758c956
commit 853c286f14

View File

@ -744,26 +744,26 @@ AcpiDmDumpTable (
/* DMAR subtable types */
Temp16 = *Target;
Temp16 = ACPI_GET16 (Target);
if (Temp16 > ACPI_DMAR_TYPE_RESERVED)
{
Temp16 = ACPI_DMAR_TYPE_RESERVED;
}
AcpiOsPrintf ("%4.4X <%s>\n", *Target, AcpiDmDmarSubnames[Temp16]);
AcpiOsPrintf ("%4.4X <%s>\n", ACPI_GET16 (Target), AcpiDmDmarSubnames[Temp16]);
break;
case ACPI_DMT_HEST:
/* HEST subtable types */
Temp16 = *Target;
Temp16 = ACPI_GET16 (Target);
if (Temp16 > ACPI_HEST_TYPE_RESERVED)
{
Temp16 = ACPI_HEST_TYPE_RESERVED;
}
AcpiOsPrintf ("%4.4X (%s)\n", *Target, AcpiDmHestSubnames[Temp16]);
AcpiOsPrintf ("%4.4X (%s)\n", ACPI_GET16 (Target), AcpiDmHestSubnames[Temp16]);
break;
case ACPI_DMT_HESTNTFY:
@ -825,6 +825,14 @@ AcpiDmDumpTable (
}
}
if (TableOffset && !SubtableLength)
{
/* If this table is not the main table, subtable must have valid length */
AcpiOsPrintf ("Invalid zero length subtable\n");
return (AE_BAD_DATA);
}
return (AE_OK);
}