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) {