All of lore.kernel.org
 help / color / mirror / Atom feed
From: Rusty Russell <rusty@rustcorp.com.au>
To: Arthur Gautier <baloo@gandi.net>
Cc: linux-kernel@vger.kernel.org, Arthur Gautier <baloo@gandi.net>
Subject: Re: [PATCH] param: fixup quote parsing of kernel arguments
Date: Wed, 08 Apr 2015 15:29:43 +0930	[thread overview]
Message-ID: <87twwr17ow.fsf@rustcorp.com.au> (raw)
In-Reply-To: <1428405635-8231-1-git-send-email-baloo@gandi.net>

Arthur Gautier <baloo@gandi.net> writes:
> When starting kernel with arguments like:
>   init=/bin/sh -c "echo arguments"
> the trailing double quote is not removed which results in following command
> being executed:
>   /bin/sh -c 'echo arguments"'
>
> This commit removes the trailing double quote.
>
> Signed-off-by: Arthur Gautier <baloo@gandi.net>

Hi Arthur,

        Thanks, I'd not considered quotes outside '='.  But this
fixes it in a weird way: we handle quotes below, we just don't do
anything for the "raw value" case:

	for (i = 0; args[i]; i++) {
		if (isspace(args[i]) && !in_quote)
			break;
		if (equals == 0) {
			if (args[i] == '=')
				equals = i;
		}
		if (args[i] == '"')
			in_quote = !in_quote;
	}

	*param = args;
	if (!equals)
		*val = NULL;
	else {
		args[equals] = '\0';
		*val = args + equals + 1;

		/* Don't include quotes in value. */
		if (**val == '"') {
			(*val)++;
			if (args[i-1] == '"')
				args[i-1] = '\0';
		}
		if (quoted && args[i-1] == '"')
			args[i-1] = '\0';
	}

The logical fix is to just always remove the close quotes in both
cases:

diff --git a/kernel/params.c b/kernel/params.c
index 728e05b167de..a22d6a759b1a 100644
--- a/kernel/params.c
+++ b/kernel/params.c
@@ -173,9 +173,9 @@ static char *next_arg(char *args, char **param, char **val)
 			if (args[i-1] == '"')
 				args[i-1] = '\0';
 		}
-		if (quoted && args[i-1] == '"')
-			args[i-1] = '\0';
 	}
+	if (quoted && args[i-1] == '"')
+		args[i-1] = '\0';
 
 	if (args[i]) {
 		args[i] = '\0';

Does this work for you?

Thanks,
Rusty.

> ---
>  kernel/params.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/kernel/params.c b/kernel/params.c
> index 728e05b..2118546 100644
> --- a/kernel/params.c
> +++ b/kernel/params.c
> @@ -156,8 +156,11 @@ static char *next_arg(char *args, char **param, char **val)
>  			if (args[i] == '=')
>  				equals = i;
>  		}
> -		if (args[i] == '"')
> +		if (args[i] == '"') {
> +			if (!equals)
> +				args[i] = '\0';
>  			in_quote = !in_quote;
> +		}
>  	}
>  
>  	*param = args;
> -- 
> 2.1.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/

  reply	other threads:[~2015-04-08  6:00 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-07 11:20 [PATCH] param: fixup quote parsing of kernel arguments Arthur Gautier
2015-04-08  5:59 ` Rusty Russell [this message]
2015-04-08  9:44   ` Arthur Gautier
2015-04-15  0:54     ` Rusty Russell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87twwr17ow.fsf@rustcorp.com.au \
    --to=rusty@rustcorp.com.au \
    --cc=baloo@gandi.net \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.