Blame SOURCES/0008-dmidecode-Refactor-ASCII-filtering-of-DMI-strings.patch

f877e3
From 26a66d708c6caef09912245c93371ec96c1e0cbd Mon Sep 17 00:00:00 2001
f877e3
From: Jean Delvare <jdelvare@suse.de>
f877e3
Date: Mon, 23 Mar 2020 16:47:44 +0100
f877e3
Subject: [PATCH 08/23] dmidecode: Refactor ASCII filtering of DMI strings
f877e3
f877e3
Split dmi_string into 3 functions to make it more modular. ASCII
f877e3
filtering is an explicit option now to give the caller more control.
f877e3
f877e3
Use the new functions in dmi_dump to avoid reimplementing the ASCII
f877e3
filtering and printing characters one by one.
f877e3
f877e3
Signed-off-by: Jean Delvare <jdelvare@suse.de>
f877e3
---
f877e3
 dmidecode.c | 60 ++++++++++++++++++++++++++++-------------------------
f877e3
 1 file changed, 32 insertions(+), 28 deletions(-)
f877e3
f877e3
diff --git a/dmidecode.c b/dmidecode.c
f877e3
index 50fd0bffa26d..8ec1d6b9597a 100644
f877e3
--- a/dmidecode.c
f877e3
+++ b/dmidecode.c
f877e3
@@ -109,13 +109,19 @@ int is_printable(const u8 *data, int len)
f877e3
 	return 1;
f877e3
 }
f877e3
 
f877e3
-const char *dmi_string(const struct dmi_header *dm, u8 s)
f877e3
+/* Replace non-ASCII characters with dots */
f877e3
+static void ascii_filter(char *bp, size_t len)
f877e3
 {
f877e3
-	char *bp = (char *)dm->data;
f877e3
-	size_t i, len;
f877e3
+	size_t i;
f877e3
 
f877e3
-	if (s == 0)
f877e3
-		return "Not Specified";
f877e3
+	for (i = 0; i < len; i++)
f877e3
+		if (bp[i] < 32 || bp[i] == 127)
f877e3
+			bp[i] = '.';
f877e3
+}
f877e3
+
f877e3
+static char *_dmi_string(const struct dmi_header *dm, u8 s, int filter)
f877e3
+{
f877e3
+	char *bp = (char *)dm->data;
f877e3
 
f877e3
 	bp += dm->length;
f877e3
 	while (s > 1 && *bp)
f877e3
@@ -126,16 +132,24 @@ const char *dmi_string(const struct dmi_header *dm, u8 s)
f877e3
 	}
f877e3
 
f877e3
 	if (!*bp)
f877e3
-		return bad_index;
f877e3
+		return NULL;
f877e3
 
f877e3
-	if (!(opt.flags & FLAG_DUMP))
f877e3
-	{
f877e3
-		/* ASCII filtering */
f877e3
-		len = strlen(bp);
f877e3
-		for (i = 0; i < len; i++)
f877e3
-			if (bp[i] < 32 || bp[i] == 127)
f877e3
-				bp[i] = '.';
f877e3
-	}
f877e3
+	if (filter)
f877e3
+		ascii_filter(bp, strlen(bp));
f877e3
+
f877e3
+	return bp;
f877e3
+}
f877e3
+
f877e3
+const char *dmi_string(const struct dmi_header *dm, u8 s)
f877e3
+{
f877e3
+	char *bp;
f877e3
+
f877e3
+	if (s == 0)
f877e3
+		return "Not Specified";
f877e3
+
f877e3
+	bp = _dmi_string(dm, s, 1);
f877e3
+	if (bp == NULL)
f877e3
+		return bad_index;
f877e3
 
f877e3
 	return bp;
f877e3
 }
f877e3
@@ -208,7 +222,7 @@ static int dmi_bcd_range(u8 value, u8 low, u8 high)
f877e3
 static void dmi_dump(const struct dmi_header *h, const char *prefix)
f877e3
 {
f877e3
 	int row, i;
f877e3
-	const char *s;
f877e3
+	char *s;
f877e3
 
f877e3
 	printf("%sHeader and Data:\n", prefix);
f877e3
 	for (row = 0; row < ((h->length - 1) >> 4) + 1; row++)
f877e3
@@ -224,7 +238,7 @@ static void dmi_dump(const struct dmi_header *h, const char *prefix)
f877e3
 	{
f877e3
 		printf("%sStrings:\n", prefix);
f877e3
 		i = 1;
f877e3
-		while ((s = dmi_string(h, i++)) != bad_index)
f877e3
+		while ((s = _dmi_string(h, i++, !(opt.flags & FLAG_DUMP))))
f877e3
 		{
f877e3
 			if (opt.flags & FLAG_DUMP)
f877e3
 			{
f877e3
@@ -238,19 +252,9 @@ static void dmi_dump(const struct dmi_header *h, const char *prefix)
f877e3
 					printf("\n");
f877e3
 				}
f877e3
 				/* String isn't filtered yet so do it now */
f877e3
-				printf("%s\t\"", prefix);
f877e3
-				while (*s)
f877e3
-				{
f877e3
-					if (*s < 32 || *s == 127)
f877e3
-						fputc('.', stdout);
f877e3
-					else
f877e3
-						fputc(*s, stdout);
f877e3
-					s++;
f877e3
-				}
f877e3
-				printf("\"\n");
f877e3
+				ascii_filter(s, l - 1);
f877e3
 			}
f877e3
-			else
f877e3
-				printf("%s\t%s\n", prefix, s);
f877e3
+			printf("%s\t%s\n", prefix, s);
f877e3
 		}
f877e3
 	}
f877e3
 }
f877e3
-- 
f877e3
2.17.1
f877e3