Module Name:    src
Committed By:   pgoyette
Date:           Sun Mar 11 11:47:45 UTC 2018

Modified Files:
        src/sys/kern [pgoyette-compat]: kern_module.c

Log Message:
Clean up the EXIST paths (module and/or alias already exists) and make
sure we always return a pointer to the duplicate.


To generate a diff of this commit:
cvs rdiff -u -r1.130.2.3 -r1.130.2.4 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.130.2.3 src/sys/kern/kern_module.c:1.130.2.4
--- src/sys/kern/kern_module.c:1.130.2.3	Sun Mar 11 08:32:21 2018
+++ src/sys/kern/kern_module.c	Sun Mar 11 11:47:45 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_module.c,v 1.130.2.3 2018/03/11 08:32:21 pgoyette Exp $	*/
+/*	$NetBSD: kern_module.c,v 1.130.2.4 2018/03/11 11:47:45 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.130.2.3 2018/03/11 08:32:21 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_module.c,v 1.130.2.4 2018/03/11 11:47:45 pgoyette Exp $");
 
 #define _MODULE_INTERNAL
 
@@ -671,9 +671,10 @@ module_alias_lookup(const char *name, mo
 	aliasp = *mod->mod_info->mi_aliases;
 	if (aliasp == NULL)
 		return 0;
-	while (*aliasp)
+	while (*aliasp) {
 		if (strcmp(*aliasp++, name) == 0)
 			return 1;
+	}
 	return 0;
 }
 
@@ -690,11 +691,10 @@ module_lookup(const char *name)
 	KASSERT(kernconfig_is_held());
 
 	TAILQ_FOREACH(mod, &module_list, mod_chain) {
-		if (strcmp(mod->mod_info->mi_name, name) == 0) {
+		if (strcmp(mod->mod_info->mi_name, name) == 0)
 			break;
 		if (module_alias_lookup(name, mod))
 			break;
-		}
 	}
 
 	return mod;
@@ -855,13 +855,17 @@ module_do_builtin(const module_t *pmod, 
 	}
 
 	/*
-	 * Retrieve that none of the module's aliases already exist
+	 * Confirm that none of the module's aliases already exist
 	 */
 
 	if ((aliasp = *mod->mod_info->mi_aliases) != NULL) {
-		while (*aliasp)
-			if (module_lookup(*aliasp++) != NULL)
+		while (*aliasp) {
+			if ((mod2 = module_lookup(*aliasp++)) != NULL) {
+				if (modp != NULL)
+					*modp = mod2;
 				return EEXIST;
+			}
+		}
 	}
 	/*
 	 * Try to initialize the module.
@@ -1084,6 +1088,8 @@ module_do_load(const char *name, bool is
 			module_error("module with name `%s' already loaded",
 			    mod2->mod_info->mi_name);
 			error = EEXIST;
+			if (modp != NULL)
+				*modp = mod2;
 			goto fail;
 		}
 	}
@@ -1171,13 +1177,19 @@ module_do_load(const char *name, bool is
 	/*
 	 * One last check for duplicate module name/alias
 	 */
-	if ((aliasp = *mod->mod_info->mi_aliases) != NULL)
-		while (*aliasp != NULL)
-			if (module_lookup(*aliasp) != NULL) {
+	if ((aliasp = *mod->mod_info->mi_aliases) != NULL) {
+		while (*aliasp != NULL) {
+			if ((mod2 = module_lookup(*aliasp)) != NULL) {
 				module_error("Module `%s' alias `%s' already "
 				    "exists", mod->mod_info->mi_name, *aliasp);
+				error = EEXIST;
+				if (modp != NULL)
+					*modp = mod2;
 				goto fail;
 			}
+			aliasp++;
+		}
+	}
 
 	prev_active = module_active;
 	module_active = mod;

Reply via email to