[PATCH][V4] dmicheck: skip scanning smbios in /dev/mem on aarch64

Alex Hung alex.hung at canonical.com
Sun Dec 12 00:32:02 UTC 2021


Signed-off-by: Alex Hung <alex.hung at canonical.com>
---
 src/dmi/dmicheck/dmicheck.c   |  14 ++++
 src/lib/include/fwts.h        |   1 +
 src/lib/include/fwts_fileio.h |   3 +
 src/lib/include/fwts_kernel.h |  25 +++++++
 src/lib/src/Makefile.am       |   1 +
 src/lib/src/fwts_fileio.c     |  39 +++++++++++
 src/lib/src/fwts_kernel.c     | 126 ++++++++++++++++++++++++++++++++++
 7 files changed, 209 insertions(+)
 create mode 100644 src/lib/include/fwts_kernel.h
 create mode 100644 src/lib/src/fwts_kernel.c

diff --git a/src/dmi/dmicheck/dmicheck.c b/src/dmi/dmicheck/dmicheck.c
index 7f6a90c4..3985b126 100644
--- a/src/dmi/dmicheck/dmicheck.c
+++ b/src/dmi/dmicheck/dmicheck.c
@@ -381,6 +381,13 @@ static void* dmi_table_smbios(fwts_framework *fw, fwts_smbios_entry *entry)
 		free(table);
 	}
 
+#ifdef FWTS_ARCH_AARCH64
+	if (fwts_kernel_config_set("CONFIG_STRICT_DEVMEM")) {
+		fwts_warning(fw, "Skipping scanning SMBIOS table in memory for arm64 systems");
+		return NULL;
+	}
+#endif
+
 	mem = fwts_mmap(addr, length);
 	if (mem != FWTS_MAP_FAILED) {
 		/* Can we safely copy the table? */
@@ -429,6 +436,13 @@ static void* dmi_table_smbios30(fwts_framework *fw, fwts_smbios30_entry *entry)
 		free(table);
 	}
 
+#ifdef FWTS_ARCH_AARCH64
+	if (fwts_kernel_config_set("CONFIG_STRICT_DEVMEM")) {
+		fwts_warning(fw, "Skipping scanning SMBIOS3 table in memory for arm64 systems");
+		return NULL;
+	}
+#endif
+
 	mem = fwts_mmap(addr, length);
 	if (mem != FWTS_MAP_FAILED) {
 		/* Can we safely copy the table? */
diff --git a/src/lib/include/fwts.h b/src/lib/include/fwts.h
index 551a4e09..be754a99 100644
--- a/src/lib/include/fwts.h
+++ b/src/lib/include/fwts.h
@@ -185,6 +185,7 @@
 #include "fwts_iasl.h"
 #include "fwts_ipmi.h"
 #include "fwts_klog.h"
+#include "fwts_kernel.h"
 #include "fwts_olog.h"
 #include "fwts_pipeio.h"
 #include "fwts_stringextras.h"
diff --git a/src/lib/include/fwts_fileio.h b/src/lib/include/fwts_fileio.h
index 99826491..108dae96 100644
--- a/src/lib/include/fwts_fileio.h
+++ b/src/lib/include/fwts_fileio.h
@@ -21,8 +21,11 @@
 #define __FWTS_FILEIO_H__
 
 #include <stdio.h>
+#include <zlib.h>
 
 fwts_list* fwts_file_read(FILE *fp);
 fwts_list* fwts_file_open_and_read(const char *file);
+fwts_list* fwts_gzfile_read(gzFile *fp);
+fwts_list* fwts_gzfile_open_and_read(const char *file);
 
 #endif
diff --git a/src/lib/include/fwts_kernel.h b/src/lib/include/fwts_kernel.h
new file mode 100644
index 00000000..a89576ae
--- /dev/null
+++ b/src/lib/include/fwts_kernel.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2021 Canonical
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef __FWTS_KERNEL_H__
+#define __FWTS_KERNEL_H__
+
+bool fwts_kernel_config_set(const char *config);
+
+#endif
diff --git a/src/lib/src/Makefile.am b/src/lib/src/Makefile.am
index 55c52b41..0a39882a 100644
--- a/src/lib/src/Makefile.am
+++ b/src/lib/src/Makefile.am
@@ -83,6 +83,7 @@ libfwts_la_SOURCES = 		\
 	fwts_ioport.c		\
 	fwts_ipmi.c		\
 	fwts_json.c		\
+	fwts_kernel.c 		\
 	fwts_keymap.c 		\
 	fwts_klog.c 		\
 	fwts_olog.c		\
diff --git a/src/lib/src/fwts_fileio.c b/src/lib/src/fwts_fileio.c
index 552fe993..6af6f00f 100644
--- a/src/lib/src/fwts_fileio.c
+++ b/src/lib/src/fwts_fileio.c
@@ -21,6 +21,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <zlib.h>
 
 #include "fwts.h"
 
@@ -61,3 +62,41 @@ fwts_list* fwts_file_open_and_read(const char *file)
 
 	return list;
 }
+
+/*
+ *  fwts_gzfile_read()
+ *	read given gz file and return contents as a list of lines
+ */
+fwts_list *fwts_gzfile_read(gzFile *fp)
+{
+	fwts_list *list;
+	char buffer[8192];
+
+	if ((list = fwts_list_new()) == NULL)
+		return NULL;
+
+	while (gzgets(*fp, buffer, sizeof(buffer)) != NULL) {
+		buffer[strlen(buffer) - 1] = '\0';	/* Chop off "\n" */
+		fwts_text_list_append(list, buffer);
+	}
+
+	return list;
+}
+
+/*
+ *  fwts_gzfile_open_and_read()
+ *	open and read gz file and return contents as a list of lines
+ */
+fwts_list* fwts_gzfile_open_and_read(const char *file)
+{
+	gzFile fp;
+	fwts_list *list;
+
+	if ((fp = gzopen(file, "r")) == Z_NULL)
+		return NULL;
+
+	list = fwts_gzfile_read(&fp);
+	(void)gzclose(fp);
+
+	return list;
+}
diff --git a/src/lib/src/fwts_kernel.c b/src/lib/src/fwts_kernel.c
new file mode 100644
index 00000000..f42e65bc
--- /dev/null
+++ b/src/lib/src/fwts_kernel.c
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2021 Canonical
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include <sys/utsname.h>
+
+#include "fwts.h"
+#include "fwts_kernel.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <bsd/string.h>
+
+#define CONFIG_FILE_PREFIX	"/boot/config-"
+#define CONFIG_FILE_PROC	"/proc/config.gz"
+
+/*
+ *  fwts_kernel_config_plain_set
+ *	 check whether a plain-text kernel config
+ */
+bool fwts_kernel_config_plain_set(const char *config)
+{
+	const size_t config_str_len = strlen(config) + 3;
+	char config_file[PATH_MAX];
+	char config_str[255];
+	size_t config_file_len;
+	fwts_list* config_list;
+	fwts_list_link *item;
+	struct utsname buf;
+
+	/* get path of config file, i.e. /boot/config-5.11.0-38-generic */
+	uname(&buf);
+	config_file_len = strlen(CONFIG_FILE_PREFIX) + strlen(buf.release) + 1;
+	(void)strlcpy(config_file, CONFIG_FILE_PREFIX, config_file_len);
+	(void)strlcat(config_file, buf.release, config_file_len);
+
+	config_list = fwts_file_open_and_read(config_file);
+	if (config_list == NULL)
+		return false;
+
+	fwts_list_foreach(item, config_list) {
+		/* check built-in, i.e. =y */
+		(void)strlcpy(config_str, config, config_str_len);
+		(void)strlcat(config_str, "=y", config_str_len);
+		if (!strncmp(fwts_text_list_text(item), config_str, strlen(config_str))) {
+			fwts_list_free(config_list, free);
+			return true;
+		}
+
+		/* check module, i.e. =m */
+		config_str[strlen(config_str) - 1] = 'm';
+		if (!strncmp(fwts_text_list_text(item), config_str, strlen(config_str))) {
+			fwts_list_free(config_list, free);
+			return true;
+		}
+	}
+
+	fwts_list_free(config_list, free);
+	return false;
+}
+
+/*
+ *  fwts_kernel_config_gz_set
+ *	 check whether a gz kernel config
+ */
+bool fwts_kernel_config_gz_set(const char *config)
+{
+	const size_t config_str_len = strlen(config) + 3;
+	char config_str[255];
+	fwts_list* config_list;
+	fwts_list_link *item;
+
+	config_list = fwts_gzfile_open_and_read(CONFIG_FILE_PROC);
+	if (config_list == NULL)
+		return false;
+
+	fwts_list_foreach(item, config_list) {
+		/* check built-in, i.e. =y */
+		(void)strlcpy(config_str, config, config_str_len);
+		(void)strlcat(config_str, "=y", config_str_len);
+		if (!strncmp(fwts_text_list_text(item), config_str, strlen(config_str))) {
+			fwts_list_free(config_list, free);
+			return true;
+		}
+
+		/* check module, i.e. =m */
+		config_str[strlen(config_str) - 1] = 'm';
+		if (!strncmp(fwts_text_list_text(item), config_str, strlen(config_str))) {
+			fwts_list_free(config_list, free);
+			return true;
+		}
+	}
+
+	fwts_list_free(config_list, free);
+	return false;
+}
+
+/*
+ *  fwts_kernel_config_set
+ *	 check whether a kernel config is set, ex.
+ *	 true if CONFIG_XYZ=y or CONFIG_XYZ=m
+ */
+bool fwts_kernel_config_set(const char *config)
+{
+	if (fwts_kernel_config_plain_set(config))
+		return true;
+
+	if (fwts_kernel_config_gz_set(config))
+		return true;
+
+	return false;
+}
-- 
2.34.1




More information about the fwts-devel mailing list