[PATCH] lib: modprobe: add checking the compressed zst module format

Ivan Hu ivan.hu at canonical.com
Fri Aug 23 04:09:17 UTC 2024


BugLink: https://bugs.launchpad.net/fwts/+bug/2077528

Newer kernel support modules compressed format zst, this make the
modules cannot be spotted correctly, add the zst checking for the
compressed modules.

Using __NR_finit_module syscall may result in an error=8(Exec format error)
So, using the modprobe command directly instead of relying on the
__NR_finit_module syscall.

Signed-off-by: Ivan Hu <ivan.hu at canonical.com>
---
 src/lib/src/fwts_modprobe.c | 44 +++++++++++++++++--------------------
 1 file changed, 20 insertions(+), 24 deletions(-)

diff --git a/src/lib/src/fwts_modprobe.c b/src/lib/src/fwts_modprobe.c
index 57d934ed..02456ec5 100644
--- a/src/lib/src/fwts_modprobe.c
+++ b/src/lib/src/fwts_modprobe.c
@@ -182,12 +182,12 @@ int fwts_module_load(fwts_framework *fw, const char *module)
 	struct utsname u;
 	const size_t modlen = strlen(module);
 	char module_ko[modlen + 4];
+	char module_ko_zst[modlen + 8];
 	char path[PATH_MAX];
 	char modpath[PATH_MAX];
-	const char *params = "";
-	int fd;
 	bool loaded = false;
-
+	int status = 0;
+	char modeprobe_ko[64];
 	/*
 	 *  No need to unload if it's not already loaded
 	 */
@@ -207,26 +207,19 @@ int fwts_module_load(fwts_framework *fw, const char *module)
 	(void)snprintf(module_ko, sizeof(module_ko), "%s.ko", module);
 	(void)snprintf(modpath, sizeof(modpath), "/lib/modules/%s", u.release);
 	if (!fwts_module_find(module_ko, modpath, path, sizeof(path))) {
-		fwts_log_error(fw, "Cannot find module %s\n", module);
-		return FWTS_ERROR;
+		(void)snprintf(module_ko_zst, sizeof(module_ko_zst), "%s.ko.zst", module);
+		if (!fwts_module_find(module_ko_zst, modpath, path, sizeof(path))) {
+			fwts_log_error(fw, "Cannot find module %s\n", module);
+			return FWTS_ERROR;
+		}
 	}
 
-	/*
-	 *  We've found it, now try and load it
-	 */
-	fd = open(path, O_RDONLY);
-	if (fd < 0) {
-		fwts_log_error(fw, "Cannot open module %s, errno=%d (%s)\n",
-			path, errno, strerror(errno));
+	(void)snprintf(modeprobe_ko, sizeof("modprobe ") + modlen, "modprobe %s", module);
+	(void)fwts_exec(modeprobe_ko, &status);
+	if (status != FWTS_OK) {
+		fwts_log_error(fw, "modprobe module %s failed\n", module);
 		return FWTS_ERROR;
 	}
-	if (sys_finit_module(fd, params, 0) < 0) {
-		fwts_log_error(fw, "Cannot load module %s, errno=%d (%s)\n",
-			path, errno, strerror(errno));
-		(void)close(fd);
-		return FWTS_ERROR;
-	}
-	(void)close(fd);
 
 	return FWTS_OK;
 }
@@ -241,7 +234,9 @@ int fwts_module_load(fwts_framework *fw, const char *module)
 int fwts_module_unload(fwts_framework *fw, const char *module)
 {
 	bool loaded = false;
-	int ret;
+	char modeprobe_ko[64];
+	const size_t modlen = strlen(module);
+	int status = 0;
 
 	/*
 	 *  No need to unload if it's not already loaded
@@ -251,11 +246,12 @@ int fwts_module_unload(fwts_framework *fw, const char *module)
 			return FWTS_OK;
 	}
 
-	ret = sys_delete_module(module, O_NONBLOCK);
-	if (ret < 0) {
-		fwts_log_error(fw, "Cannot unload module %s, errno=%d (%s)\n",
-			module, errno, strerror(errno));
+	(void)snprintf(modeprobe_ko, sizeof("modprobe -r") + modlen, "modprobe -r %s", module);
+	(void)fwts_exec(modeprobe_ko, &status);
+	if (status != FWTS_OK) {
+		fwts_log_error(fw, "Cannot unload module %s\n", module);
 		return FWTS_ERROR;
 	}
+
 	return FWTS_OK;
 }
-- 
2.34.1




More information about the fwts-devel mailing list