Anton Arapov 2202f1
From 12fbde92a26da61eda9f2ff0ba3c316779163f10 Mon Sep 17 00:00:00 2001
Anton Arapov 2202f1
From: Jean Delvare <jdelvare@suse.de>
Anton Arapov 2202f1
Date: Fri, 20 Jan 2017 10:57:12 +0100
Anton Arapov 2202f1
Subject: [PATCH 18/19] Only decode one DMI table
Anton Arapov 2202f1
Anton Arapov 2202f1
Since version 3.0.0 of the SMBIOS specification, there can be
Anton Arapov 2202f1
multiple entry points in memory, pointing to one or two DMI tables.
Anton Arapov 2202f1
If both a 32-bit ("_SM_") entry point and a 64-bit ("_SM3_") entry
Anton Arapov 2202f1
point are present, the specification requires that the latter points
Anton Arapov 2202f1
to a table which is a super-set of the table pointed to by the
Anton Arapov 2202f1
former. Therefore it makes no sense to decode both.
Anton Arapov 2202f1
Anton Arapov 2202f1
Per specification, look for a 64-bit ("_SM3_") entry point first, and
Anton Arapov 2202f1
if we can't find any, look for a 32-bit ("_SM_" or "_DMI_") entry
Anton Arapov 2202f1
point.
Anton Arapov 2202f1
Anton Arapov 2202f1
This fixes bug #50022:
Anton Arapov 2202f1
https://savannah.nongnu.org/bugs/?50022
Anton Arapov 2202f1
---
Anton Arapov 2202f1
 CHANGELOG   |  6 ++++++
Anton Arapov 2202f1
 dmidecode.c | 19 ++++++++++++++-----
Anton Arapov 2202f1
 2 files changed, 20 insertions(+), 5 deletions(-)
Anton Arapov 2202f1
Anton Arapov 2202f1
diff --git a/CHANGELOG b/CHANGELOG
Anton Arapov 2202f1
index ac748b0..67aef99 100644
Anton Arapov 2202f1
--- a/CHANGELOG
Anton Arapov 2202f1
+++ b/CHANGELOG
Anton Arapov 2202f1
@@ -1,3 +1,9 @@
Anton Arapov 2202f1
+2017-01-20  Jean Delvare  <jdelvare@suse.de>
Anton Arapov 2202f1
+
Anton Arapov 2202f1
+	* dmidecode.c: Only decode one DMI table.
Anton Arapov 2202f1
+	  This fixes Savannah bug #50022:
Anton Arapov 2202f1
+	  https://savannah.nongnu.org/bugs/?50022
Anton Arapov 2202f1
+
Anton Arapov 2202f1
 2016-09-22  Jean Delvare  <jdelvare@suse.de>
Anton Arapov 2202f1
 
Anton Arapov 2202f1
 	* README: Explain that we can no longer support Cygwin.
Anton Arapov 2202f1
diff --git a/dmidecode.c b/dmidecode.c
Anton Arapov 2202f1
index 3993592..4b46a13 100644
Anton Arapov 2202f1
--- a/dmidecode.c
Anton Arapov 2202f1
+++ b/dmidecode.c
Anton Arapov 2202f1
@@ -4925,28 +4925,37 @@ memory_scan:
Anton Arapov 2202f1
 		goto exit_free;
Anton Arapov 2202f1
 	}
Anton Arapov 2202f1
 
Anton Arapov 2202f1
-	for (fp = 0; fp <= 0xFFF0; fp += 16)
Anton Arapov 2202f1
+	/* Look for a 64-bit entry point first */
Anton Arapov 2202f1
+	for (fp = 0; fp <= 0xFFE0; fp += 16)
Anton Arapov 2202f1
 	{
Anton Arapov 2202f1
-		if (memcmp(buf + fp, "_SM3_", 5) == 0 && fp <= 0xFFE0)
Anton Arapov 2202f1
+		if (memcmp(buf + fp, "_SM3_", 5) == 0)
Anton Arapov 2202f1
 		{
Anton Arapov 2202f1
 			if (smbios3_decode(buf + fp, opt.devmem, 0))
Anton Arapov 2202f1
 			{
Anton Arapov 2202f1
 				found++;
Anton Arapov 2202f1
-				fp += 16;
Anton Arapov 2202f1
+				goto done;
Anton Arapov 2202f1
 			}
Anton Arapov 2202f1
 		}
Anton Arapov 2202f1
-		else if (memcmp(buf + fp, "_SM_", 4) == 0 && fp <= 0xFFE0)
Anton Arapov 2202f1
+	}
Anton Arapov 2202f1
+
Anton Arapov 2202f1
+	/* If none found, look for a 32-bit entry point */
Anton Arapov 2202f1
+	for (fp = 0; fp <= 0xFFF0; fp += 16)
Anton Arapov 2202f1
+	{
Anton Arapov 2202f1
+		if (memcmp(buf + fp, "_SM_", 4) == 0 && fp <= 0xFFE0)
Anton Arapov 2202f1
 		{
Anton Arapov 2202f1
 			if (smbios_decode(buf + fp, opt.devmem, 0))
Anton Arapov 2202f1
 			{
Anton Arapov 2202f1
 				found++;
Anton Arapov 2202f1
-				fp += 16;
Anton Arapov 2202f1
+				goto done;
Anton Arapov 2202f1
 			}
Anton Arapov 2202f1
 		}
Anton Arapov 2202f1
 		else if (memcmp(buf + fp, "_DMI_", 5) == 0)
Anton Arapov 2202f1
 		{
Anton Arapov 2202f1
 			if (legacy_decode(buf + fp, opt.devmem, 0))
Anton Arapov 2202f1
+			{
Anton Arapov 2202f1
 				found++;
Anton Arapov 2202f1
+				goto done;
Anton Arapov 2202f1
+			}
Anton Arapov 2202f1
 		}
Anton Arapov 2202f1
 	}
Anton Arapov 2202f1
 
Anton Arapov 2202f1
-- 
Anton Arapov 2202f1
2.9.3
Anton Arapov 2202f1