Re: [RFC] Re: Parsing kernel parameters and escaping "

From: Rusty Russell
Date: Sun Jul 12 2009 - 05:42:18 EST


On Tue, 7 Jul 2009 10:24:18 am Daniel Mierswa wrote:
> There was a limitation for kernel parameters with regards to quoting. It
> wasn't possible to escape quotes or use quotes to form space-filled
> values inside parameters.

Hi Daniel!

Yes, we've never had the ability to escape quotes (and you're the first to
ask), so when I wrote this code I kept it simple. You can have spaced out
values, but you need to quote the whole thing "param=some value with spaces".

We have to be careful not to break existing cmdlines tho: I don't know
if anyone uses \ currently, but simply interpreting \" is probably safe.

> +/* handle quotes in tokens (parameter and values)
> + * '" foo bar "' => ' foo bar '
> + * '" foo \" "' => ' foo " '
> + */
> +static void add_token(char ** token, char * args)

add_token is a weird name for this. It actually mangles the argument, and it
really should return the char *.

How about something like:
static unsigned int pull_token(char *args, const char *delim)

Which unescapes and returns the length of the token, or zero if it simply
swallowed delimeters? Assuming it always nul terminates, then the caller can
simply do:

while (*args) {
len = pull_token(args, " \t\n=");
if (!len)
/* Leading whitespace. */
continue;
*param = args;
args += len;
if (args[0] != '=') {
*val = NULL;
} else {
len = pull_token(args+1, " \t\n");
*val = args;
args += len;
}

Important cases to test are:
x param = "x", val = NULL
x= param = "x", val = ""
x=y=1 param = "x", val = "y=1"

Plus all variations where x and y contain quotes.

Cheers,
Rusty.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/