From 11d40ab4145a5ca3af15955b8cc5f50685ca3497 Mon Sep 17 00:00:00 2001 From: khali Date: Mon, 27 Apr 2015 08:45:40 +0000 Subject: dmidecode: Stop decoding v3 tables at End-of-Table marker The SMBIOS v3 64-bit entry points do not provide the exact size of the DMI table, only a maximum, so we have to stop decoding at the End-of-Table (127) type structure. --- CHANGELOG | 1 + dmidecode.c | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 35bfd10..dc0110a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -12,6 +12,7 @@ * dmidecode.c: Add 4 new memory device types (DMI type 17). * dmidecode.c: Add support for processors with more than 255 cores or threads (DMI type 4). + * dmidecode.c: Stop decoding v3 tables at End-of-Table marker. 2015-04-21 Roy Franz diff --git a/dmidecode.c b/dmidecode.c index 693e417..4ababd7 100644 --- a/dmidecode.c +++ b/dmidecode.c @@ -72,6 +72,7 @@ static const char *bad_index = ""; #define SUPPORTED_SMBIOS_VER 0x0300 #define FLAG_NO_FILE_OFFSET (1 << 0) +#define FLAG_STOP_AT_EOT (1 << 1) #define SYS_ENTRY_FILE "/sys/firmware/dmi/tables/smbios_entry_point" #define SYS_TABLE_FILE "/sys/firmware/dmi/tables/DMI" @@ -4491,6 +4492,10 @@ static void dmi_table(off_t base, u32 len, u16 num, u16 ver, const char *devmem, data = next; i++; + + /* SMBIOS v3 requires stopping at this marker */ + if (h.type == 127 && (flags & FLAG_STOP_AT_EOT)) + break; } /* @@ -4563,7 +4568,7 @@ static int smbios3_decode(u8 *buf, const char *devmem, u32 flags) } dmi_table(((off_t)offset.h << 32) | offset.l, - WORD(buf + 0x0C), 0, ver, devmem, flags); + WORD(buf + 0x0C), 0, ver, devmem, flags | FLAG_STOP_AT_EOT); if (opt.flags & FLAG_DUMP_BIN) { -- cgit v1.2.1