From c5830bdf6558edbc567d7c5dce1ff8059049e202 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Wed, 2 Feb 2011 00:00:36 +0100 Subject: 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 --- modutils/modutils.c | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) (limited to 'modutils/modutils.c') diff --git a/modutils/modutils.c b/modutils/modutils.c index 415dbbe44..6187ca72f 100644 --- a/modutils/modutils.c +++ b/modutils/modutils.c @@ -62,7 +62,7 @@ char* FAST_FUNC filename2modname(const char *filename, char *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; int optlen; @@ -70,13 +70,31 @@ char* FAST_FUNC parse_cmdline_module_options(char **argv) options = xzalloc(1); optlen = 0; while (*++argv) { - options = xrealloc(options, optlen + 2 + strlen(*argv) + 2); - /* Spaces handled by "" pairs, but no way of escaping quotes */ -//TODO: module-init-tools version 3.11.1 quotes only value: -//it generates var="val with spaces", not "var=val with spaces" -//(and it won't quote var *name* even if it has spaces) - optlen += sprintf(options + optlen, (strchr(*argv, ' ') ? "\"%s\" " : "%s "), *argv); + const char *fmt; + const char *var; + const char *val; + + var = *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; } -- cgit v1.2.3-55-g6feb