diff options
Diffstat (limited to 'modutils/modprobe.c')
-rw-r--r-- | modutils/modprobe.c | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/modutils/modprobe.c b/modutils/modprobe.c index f090428..aedde5c 100644 --- a/modutils/modprobe.c +++ b/modutils/modprobe.c @@ -229,26 +229,20 @@ 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) { struct module_entry *m; - /* - * get_or_add_modentry() strips path from name and works - * on remaining basename. - * This would make "rmmod dir/name" and "modprobe dir/name" - * to work like "rmmod name" and "modprobe name", - * which is wrong, and can be abused via implicit modprobing: - * "ifconfig /usbserial up" tries to modprobe netdev-/usbserial. - */ - if (strchr(name, '/')) - bb_error_msg_and_die("malformed module name '%s'", name); - m = get_or_add_modentry(name); if (!(option_mask32 & (OPT_REMOVE | OPT_SHOW_DEPS)) && (m->flags & MODULE_FLAG_LOADED) @@ -428,7 +422,7 @@ static int do_modprobe(struct module_entry *m) rc = 0; fn = llist_pop(&m->deps); /* we leak it */ - m2 = get_or_add_modentry(fn); + m2 = get_or_add_modentry(bb_get_last_path_component_nostrip(fn)); if (option_mask32 & OPT_REMOVE) { /* modprobe -r */ @@ -510,7 +504,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) @@ -557,7 +551,6 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv) if (opt & OPT_LIST_ONLY) { int i; - char name[MODULE_NAME_LEN]; char *colon, *tokens[2]; parser_t *p = config_open2(CONFIG_DEFAULT_DEPMOD_FILE, xfopen_for_read); @@ -569,10 +562,14 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv) if (!colon) continue; *colon = '\0'; - filename2modname(tokens[0], name); if (!argv[0]) puts(tokens[0]); else { + char name[MODULE_NAME_LEN]; + filename2modname( + bb_get_last_path_component_nostrip(tokens[0]), + name + ); for (i = 0; argv[i]; i++) { if (fnmatch(argv[i], name, 0) == 0) { puts(tokens[0]); |