modprobe: handle module arguments containing spaces
Modprobe wasn't correctly parsing module arguments containing spaces from /proc/cmdline - E.G. module.property="some text". Extend the parsing to correctly handle quoted text. Signed-off-by: Peter Korsgaard <peter@korsgaard.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
ca25af9b06
commit
875297378c
@ -348,6 +348,38 @@ static const char *humanly_readable_name(struct module_entry *m)
|
|||||||
return m->probed_name ? m->probed_name : m->modname;
|
return m->probed_name ? m->probed_name : m->modname;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Like strsep(&stringp, "\n\t ") but quoted text goes to single token
|
||||||
|
* even if it contains whitespace.
|
||||||
|
*/
|
||||||
|
static char *strsep_quotes(char **stringp)
|
||||||
|
{
|
||||||
|
char *s, *start = *stringp;
|
||||||
|
|
||||||
|
if (!start)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
for (s = start; ; s++) {
|
||||||
|
switch (*s) {
|
||||||
|
case '"':
|
||||||
|
s = strchrnul(s + 1, '"'); /* find trailing quote */
|
||||||
|
if (*s != '\0')
|
||||||
|
s++; /* skip trailing quote */
|
||||||
|
/* fall through */
|
||||||
|
case '\0':
|
||||||
|
case '\n':
|
||||||
|
case '\t':
|
||||||
|
case ' ':
|
||||||
|
if (*s != '\0') {
|
||||||
|
*s = '\0';
|
||||||
|
*stringp = s + 1;
|
||||||
|
} else {
|
||||||
|
*stringp = NULL;
|
||||||
|
}
|
||||||
|
return start;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static char *parse_and_add_kcmdline_module_options(char *options, const char *modulename)
|
static char *parse_and_add_kcmdline_module_options(char *options, const char *modulename)
|
||||||
{
|
{
|
||||||
char *kcmdline_buf;
|
char *kcmdline_buf;
|
||||||
@ -359,7 +391,7 @@ static char *parse_and_add_kcmdline_module_options(char *options, const char *mo
|
|||||||
return options;
|
return options;
|
||||||
|
|
||||||
kcmdline = kcmdline_buf;
|
kcmdline = kcmdline_buf;
|
||||||
while ((kptr = strsep(&kcmdline, "\n\t ")) != NULL) {
|
while ((kptr = strsep_quotes(&kcmdline)) != NULL) {
|
||||||
char *after_modulename = is_prefixed_with(kptr, modulename);
|
char *after_modulename = is_prefixed_with(kptr, modulename);
|
||||||
if (!after_modulename || *after_modulename != '.')
|
if (!after_modulename || *after_modulename != '.')
|
||||||
continue;
|
continue;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user