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:
parent
8ae386bf19
commit
c5830bdf65
@ -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));
|
||||||
|
|
||||||
|
@ -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 */
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 \
|
||||||
|
Loading…
Reference in New Issue
Block a user