[git commit] modprobe: handle module arguments containing spaces

Denys Vlasenko vda.linux at googlemail.com
Wed Sep 9 12:55:07 UTC 2015


commit: http://git.busybox.net/busybox/commit/?id=875297378cdbebb1278a4595f9fffffca3fc2303
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

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 at korsgaard.com>
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 modutils/modprobe.c |   34 +++++++++++++++++++++++++++++++++-
 1 files changed, 33 insertions(+), 1 deletions(-)

diff --git a/modutils/modprobe.c b/modutils/modprobe.c
index 996de40..314a7a1 100644
--- a/modutils/modprobe.c
+++ b/modutils/modprobe.c
@@ -348,6 +348,38 @@ static const char *humanly_readable_name(struct module_entry *m)
 	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)
 {
 	char *kcmdline_buf;
@@ -359,7 +391,7 @@ static char *parse_and_add_kcmdline_module_options(char *options, const char *mo
 		return options;
 
 	kcmdline = kcmdline_buf;
-	while ((kptr = strsep(&kcmdline, "\n\t ")) != NULL) {
+	while ((kptr = strsep_quotes(&kcmdline)) != NULL) {
 		char *after_modulename = is_prefixed_with(kptr, modulename);
 		if (!after_modulename || *after_modulename != '.')
 			continue;


More information about the busybox-cvs mailing list