Module Name: src Committed By: maya Date: Wed Feb 1 01:51:07 UTC 2017
Modified Files: src/sys/kern: kern_module.c Log Message: restore r1.118 To generate a diff of this commit: cvs rdiff -u -r1.119 -r1.120 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.119 src/sys/kern/kern_module.c:1.120 --- src/sys/kern/kern_module.c:1.119 Tue Dec 27 09:34:44 2016 +++ src/sys/kern/kern_module.c Wed Feb 1 01:51:07 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_module.c,v 1.119 2016/12/27 09:34:44 maya Exp $ */ +/* $NetBSD: kern_module.c,v 1.120 2017/02/01 01:51:07 maya 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.119 2016/12/27 09:34:44 maya Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_module.c,v 1.120 2017/02/01 01:51:07 maya Exp $"); #define _MODULE_INTERNAL @@ -570,20 +570,31 @@ int module_load(const char *filename, int flags, prop_dictionary_t props, modclass_t modclass) { + module_t *mod; int error; + /* Test if we already have the module loaded before + * authorizing so we have the opportunity to return EEXIST. */ + kernconfig_lock(); + mod = module_lookup(filename); + if (mod != NULL) { + module_print("%s module `%s' already loaded", + "requested", filename); + error = EEXIST; + goto out; + } + /* Authorize. */ error = kauth_authorize_system(kauth_cred_get(), KAUTH_SYSTEM_MODULE, 0, (void *)(uintptr_t)MODCTL_LOAD, NULL, NULL); - if (error != 0) { - return error; - } + if (error != 0) + goto out; - kernconfig_lock(); error = module_do_load(filename, false, flags, props, NULL, modclass, false); - kernconfig_unlock(); +out: + kernconfig_unlock(); return error; }