Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/pgoyette-compat]: src/sys/kern Clean up the EXIST paths (module and/or a...



details:   https://anonhg.NetBSD.org/src/rev/ec5ec65590bb
branches:  pgoyette-compat
changeset: 321010:ec5ec65590bb
user:      pgoyette <pgoyette%NetBSD.org@localhost>
date:      Sun Mar 11 11:47:45 2018 +0000

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

diffstat:

 sys/kern/kern_module.c |  34 +++++++++++++++++++++++-----------
 1 files changed, 23 insertions(+), 11 deletions(-)

diffs (96 lines):

diff -r 44a81cb86cf9 -r ec5ec65590bb sys/kern/kern_module.c
--- a/sys/kern/kern_module.c    Sun Mar 11 09:34:59 2018 +0000
+++ b/sys/kern/kern_module.c    Sun Mar 11 11:47:45 2018 +0000
@@ -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 @@
        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 @@
        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 @@
        }
 
        /*
-        * 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_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 @@
        /*
         * 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;



Home | Main Index | Thread Index | Old Index