modprobe: fix "modprobe devname:snd/timer" case (alias with a slash)
authorDenys Vlasenko <vda.linux@googlemail.com>
Thu, 15 Jan 2015 02:04:23 +0000 (03:04 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Thu, 15 Jan 2015 02:04:23 +0000 (03:04 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
modutils/modprobe.c

index d1adaf8e18b039bc901aa951d147d24e1e51acf4..ce8b0b886f1d73da0cef92a1c7001f37a4754bd2 100644 (file)
@@ -207,7 +207,7 @@ static struct module_entry *helper_get_module(const char *module, int create)
        unsigned i;
        unsigned hash;
 
-       filename2modname(bb_get_last_path_component_nostrip(module), modname);
+       filename2modname(module, modname);
 
        hash = 0;
        for (i = 0; modname[i]; i++)
@@ -232,9 +232,14 @@ static ALWAYS_INLINE struct module_entry *get_or_add_modentry(const char *module
 {
        return helper_get_module(module, 1);
 }
-static ALWAYS_INLINE struct module_entry *get_modentry(const char *module)
+/* So far this function always gets a module pathname, never an alias name.
+ * The crucial difference is that pathname needs dirname stripping,
+ * while alias name must NOT do it!
+ * Testcase where dirname stripping is likely to go wrong: "modprobe devname:snd/timer"
+ */
+static ALWAYS_INLINE struct module_entry *get_modentry(const char *pathname)
 {
-       return helper_get_module(module, 0);
+       return helper_get_module(bb_get_last_path_component_nostrip(pathname), 0);
 }
 
 static void add_probe(const char *name)
@@ -502,7 +507,7 @@ static void load_modules_dep(void)
                colon = last_char_is(tokens[0], ':');
                if (colon == NULL)
                        continue;
-               *colon = 0;
+               *colon = '\0';
 
                m = get_modentry(tokens[0]);
                if (m == NULL)