modprobe/insmod: fix parameter quoting

function                                             old     new   delta
parse_cmdline_module_options                         102     157     +55
modprobe_main                                        657     662      +5
insmod_main                                           68      70      +2
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/0 up/down: 62/0)               Total: 62 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2011-02-02 00:00:36 +01:00
parent 8ae386bf19
commit c5830bdf65
4 changed files with 28 additions and 10 deletions

View File

@ -59,7 +59,7 @@ int insmod_main(int argc UNUSED_PARAM, char **argv)
if (!filename) if (!filename)
bb_show_usage(); bb_show_usage();
rc = bb_init_module(filename, parse_cmdline_module_options(argv)); rc = bb_init_module(filename, parse_cmdline_module_options(argv, /*quote_spaces:*/ 0));
if (rc) if (rc)
bb_error_msg("can't insert '%s': %s", filename, moderror(rc)); bb_error_msg("can't insert '%s': %s", filename, moderror(rc));

View File

@ -589,7 +589,7 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv)
/* First argument is module name, rest are parameters */ /* First argument is module name, rest are parameters */
DBG("probing just module %s", *argv); DBG("probing just module %s", *argv);
add_probe(argv[0]); add_probe(argv[0]);
G.cmdline_mopts = parse_cmdline_module_options(argv); G.cmdline_mopts = parse_cmdline_module_options(argv, /*quote_spaces:*/ 1);
} }
/* Happens if all requested modules are already loaded */ /* Happens if all requested modules are already loaded */

View File

@ -62,7 +62,7 @@ char* FAST_FUNC filename2modname(const char *filename, char *modname)
return modname; return modname;
} }
char* FAST_FUNC parse_cmdline_module_options(char **argv) char* FAST_FUNC parse_cmdline_module_options(char **argv, int quote_spaces)
{ {
char *options; char *options;
int optlen; int optlen;
@ -70,13 +70,31 @@ char* FAST_FUNC parse_cmdline_module_options(char **argv)
options = xzalloc(1); options = xzalloc(1);
optlen = 0; optlen = 0;
while (*++argv) { while (*++argv) {
options = xrealloc(options, optlen + 2 + strlen(*argv) + 2); const char *fmt;
/* Spaces handled by "" pairs, but no way of escaping quotes */ const char *var;
//TODO: module-init-tools version 3.11.1 quotes only value: const char *val;
//it generates var="val with spaces", not "var=val with spaces"
//(and it won't quote var *name* even if it has spaces) var = *argv;
optlen += sprintf(options + optlen, (strchr(*argv, ' ') ? "\"%s\" " : "%s "), *argv); options = xrealloc(options, optlen + 2 + strlen(var) + 2);
fmt = "%.*s%s ";
val = strchrnul(var, '=');
if (quote_spaces) {
/*
* modprobe (module-init-tools version 3.11.1) compat:
* quote only value:
* var="val with spaces", not "var=val with spaces"
* (note: var *name* is not checked for spaces!)
*/
if (*val) { /* has var=val format. skip '=' */
val++;
if (strchr(val, ' '))
fmt = "%.*s\"%s\" ";
}
}
optlen += sprintf(options + optlen, fmt, (int)(val - var), var, val);
} }
/* Remove trailing space. Disabled */
/* if (optlen != 0) options[optlen-1] = '\0'; */
return options; return options;
} }

View File

@ -21,7 +21,7 @@ void replace(char *s, char what, char with) FAST_FUNC;
char *replace_underscores(char *s) FAST_FUNC; char *replace_underscores(char *s) FAST_FUNC;
int string_to_llist(char *string, llist_t **llist, const char *delim) FAST_FUNC; int string_to_llist(char *string, llist_t **llist, const char *delim) FAST_FUNC;
char *filename2modname(const char *filename, char *modname) FAST_FUNC; char *filename2modname(const char *filename, char *modname) FAST_FUNC;
char *parse_cmdline_module_options(char **argv) FAST_FUNC; char *parse_cmdline_module_options(char **argv, int quote_spaces) FAST_FUNC;
/* insmod for 2.4 and modprobe's options (insmod 2.6 has no options at all): */ /* insmod for 2.4 and modprobe's options (insmod 2.6 has no options at all): */
#define INSMOD_OPTS \ #define INSMOD_OPTS \