From 57f560bc1299204392dfa482c4c76a44f2be1acb Mon Sep 17 00:00:00 2001 From: pgoyette Date: Sun, 10 Dec 2017 03:08:32 +0000 Subject: [PATCH] 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 --- sys/kern/kern_module.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/sys/kern/kern_module.c b/sys/kern/kern_module.c index c432a1bdf1ac..8f1d1292333f 100644 --- a/sys/kern/kern_module.c +++ b/sys/kern/kern_module.c @@ -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 -__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 @@ -1038,6 +1038,23 @@ module_do_load(const char *name, bool isdep, int flags, goto fail; } + /* + * 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. */