summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkhali <khali>2015-04-27 08:45:40 +0000
committerkhali <khali>2015-04-27 08:45:40 +0000
commit11d40ab4145a5ca3af15955b8cc5f50685ca3497 (patch)
treefb11d33230b05f37598c567c8157a6922d68c20e
parenta6e5b96b3ec62a0d27f3daa706e3554bebf39aff (diff)
downloaddmidecode-11d40ab4145a5ca3af15955b8cc5f50685ca3497.tar.gz
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.
-rw-r--r--CHANGELOG1
-rw-r--r--dmidecode.c7
2 files changed, 7 insertions, 1 deletions
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 <roy.franz@linaro.org>
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 = "<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)
{