Module Name:    src
Committed By:   pgoyette
Date:           Sun Dec 10 03:08:32 UTC 2017

Modified Files:
        src/sys/kern: kern_module.c

Log Message:
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.

XXX pullup to netbsd-8


To generate a diff of this commit:
cvs rdiff -u -r1.125 -r1.126 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.126
--- src/sys/kern/kern_module.c:1.125	Thu Jun  1 02:45:13 2017
+++ src/sys/kern/kern_module.c	Sun Dec 10 03:08:32 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.126 2017/12/10 03:08:32 pgoyette 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.126 2017/12/10 03:08:32 pgoyette 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) {

Reply via email to