|
@@ -89,9 +89,9 @@ static void dmi_table(u8 *buf,
|
|
|
|
|
|
/*
|
|
|
* Stop when we have seen all the items the table claimed to have
|
|
|
- * (SMBIOS < 3.0 only) OR we reach an end-of-table marker OR we run
|
|
|
- * off the end of the table (should never happen but sometimes does
|
|
|
- * on bogus implementations.)
|
|
|
+ * (SMBIOS < 3.0 only) OR we reach an end-of-table marker (SMBIOS
|
|
|
+ * >= 3.0 only) OR we run off the end of the table (should never
|
|
|
+ * happen but sometimes does on bogus implementations.)
|
|
|
*/
|
|
|
while ((!dmi_num || i < dmi_num) &&
|
|
|
(data - buf + sizeof(struct dmi_header)) <= dmi_len) {
|
|
@@ -110,8 +110,13 @@ static void dmi_table(u8 *buf,
|
|
|
|
|
|
/*
|
|
|
* 7.45 End-of-Table (Type 127) [SMBIOS reference spec v3.0.0]
|
|
|
+ * For tables behind a 64-bit entry point, we have no item
|
|
|
+ * count and no exact table length, so stop on end-of-table
|
|
|
+ * marker. For tables behind a 32-bit entry point, we have
|
|
|
+ * seen OEM structures behind the end-of-table marker on
|
|
|
+ * some systems, so don't trust it.
|
|
|
*/
|
|
|
- if (dm->type == DMI_ENTRY_END_OF_TABLE)
|
|
|
+ if (!dmi_num && dm->type == DMI_ENTRY_END_OF_TABLE)
|
|
|
break;
|
|
|
|
|
|
data += 2;
|