Module Name:    src
Committed By:   snj
Date:           Thu Dec 21 21:37:03 UTC 2017

Modified Files:
        src/sys/kern [netbsd-8]: kern_module.c

Log Message:
Pull up following revision(s) (requested by pgoyette in ticket #449):
        sys/kern/kern_module.c: 1.126-1.130
Add additional duplicate-module-name check in case we have two modules
with the same internal name but no conflicting symbol definitions.
When we load a module from the file system, the filename may have no
relationship to the internal module's name.  Furthermore, comparing
the module's filename is insufficient if the file is loaded from an
absolute path.
--
Use KASSERT to ensure that the newly-added module's name can be found.
--
Change a KASSERTMSG into a regular module_error - not nice for the
kernel
to panic when I try to modload the 'ntfs' module.
--
When looking for a duplicate module name, also check the pending list.
--
Remove the check for duplicate-module-name-on-pending-list since it really
doesn't help.  The check really cannot fail, and it only looks at the list
belonging to the current level of recursion.
Instead, verify that the module's modcmd(MODULE_CMD_INIT, ...) does not
introduce a duplicate module name as a result of recursively calling
module_do_load().


To generate a diff of this commit:
cvs rdiff -u -r1.125 -r1.125.2.1 src/sys/kern/kern_module.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/kern_module.c
diff -u src/sys/kern/kern_module.c:1.125 src/sys/kern/kern_module.c:1.125.2.1
--- src/sys/kern/kern_module.c:1.125	Thu Jun  1 02:45:13 2017
+++ src/sys/kern/kern_module.c	Thu Dec 21 21:37:03 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_module.c,v 1.125 2017/06/01 02:45:13 chs Exp $	*/
+/*	$NetBSD: kern_module.c,v 1.125.2.1 2017/12/21 21:37:03 snj Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_module.c,v 1.125 2017/06/01 02:45:13 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_module.c,v 1.125.2.1 2017/12/21 21:37:03 snj Exp $");
 
 #define _MODULE_INTERNAL
 
@@ -1039,6 +1039,23 @@ module_do_load(const char *name, bool is
 	}
 
 	/*
+	 * If we loaded a module from the filesystem, check the actual
+	 * module name (from the modinfo_t) to ensure another module
+	 * with the same name doesn't already exist.  (There's no
+	 * guarantee the filename will match the module name, and the
+	 * dup-symbols check may not be sufficient.)
+	 */
+	if (mod->mod_source == MODULE_SOURCE_FILESYS) {
+		mod2 = module_lookup(mod->mod_info->mi_name);
+		if ( mod2 && mod2 != mod) {
+			module_error("module with name `%s' already loaded",
+			    mod2->mod_info->mi_name);
+			error = EEXIST;
+			goto fail;
+		}
+	}
+
+	/*
 	 * Block circular dependencies.
 	 */
 	TAILQ_FOREACH(mod2, pending, mod_chain) {
@@ -1133,6 +1150,18 @@ module_do_load(const char *name, bool is
 	}
 
 	/*
+	 * If a recursive load already added a module with the same
+	 * name, abort.
+	 */
+	mod2 = module_lookup(mi->mi_name);
+	if (mod2 && mod2 != mod) {
+		module_error("recursive load causes duplicate module `%s'",
+		    mi->mi_name);
+		error = EEXIST;
+		goto fail1;
+	}
+
+	/*
 	 * Good, the module loaded successfully.  Put it onto the
 	 * list and add references to its requisite modules.
 	 */
@@ -1154,6 +1183,8 @@ module_do_load(const char *name, bool is
 	module_print("module `%s' loaded successfully", mi->mi_name);
 	return 0;
 
+ fail1:
+	(*mi->mi_modcmd)(MODULE_CMD_FINI, NULL);
  fail:
 	kobj_unload(mod->mod_kobj);
  fail2:

Reply via email to