Patchwork config-host.mak: escape configure arguments

login
register
mail settings
Submitter Gabriel Kerneis
Date Oct. 5, 2013, 2:41 p.m.
Message ID <1380984092-18502-1-git-send-email-gabriel@kerneis.info>
Download mbox | patch
Permalink /patch/280773/
State New
Headers show

Comments

Gabriel Kerneis - Oct. 5, 2013, 2:41 p.m.
Escape single quotes and newlines when writing configure arguments
to config-host.mak. This is necessary to allow correct regeneration
by re-executing configure in a shell when config-host.mak becomes
out-of-date.

Signed-off-by: Gabriel Kerneis <gabriel@kerneis.info>
---
 configure | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
Peter Maydell - Oct. 5, 2013, 3:54 p.m.
On 5 October 2013 23:41, Gabriel Kerneis <gabriel@kerneis.info> wrote:
> Escape single quotes and newlines when writing configure arguments
> to config-host.mak. This is necessary to allow correct regeneration
> by re-executing configure in a shell when config-host.mak becomes
> out-of-date.
>
> Signed-off-by: Gabriel Kerneis <gabriel@kerneis.info>
> ---
>  configure | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/configure b/configure
> index 23dbaaf..fba7c1f 100755
> --- a/configure
> +++ b/configure
> @@ -3769,7 +3769,11 @@ echo "# Automatically generated by configure - do not modify" >config-all-disas.
>
>  echo "# Automatically generated by configure - do not modify" > $config_host_mak
>  printf "# Configured with:" >> $config_host_mak
> -printf " '%s'" "$0" "$@" >> $config_host_mak
> +for arg in "$0" "$@"; do
> +  # join each arg on a single line, escaping newlines and single quotes
> +  quoted_arg=$(echo "$arg" | sed ":a;N;s/\n/\\\\n/;ba" | sed "s/'/'\\\\''/g")

So this sed script appears to convert literal newlines in the input
into backslash-n:

mnementh$ foo='hello
> world'
mnementh$ quoted_arg=$(echo "$foo" | sed ":a;N;s/\n/\\\\n/;ba" | sed
"s/'/'\\\\''/g")
mnementh$ printf " '%s'" "$quoted_arg"
 'hello\nworld'

Is that what's intended? It doesn't seem very useful because if you cut-n-paste
(or pipe) 'hello\nworld' into a shell you get an actual backslash-n,
not a newline.

thanks
-- PMM
Gabriel Kerneis - Oct. 5, 2013, 10:18 p.m.
On Sun, Oct 06, 2013 at 12:54:08AM +0900, Peter Maydell wrote:
> So this sed script appears to convert literal newlines in the input
> Is that what's intended?

Yes.

> It doesn't seem very useful because if you cut-n-paste (or pipe)
> 'hello\nworld' into a shell you get an actual backslash-n, not a newline.

You're right.  Then the best is probably to expect that ./configure parameters
will not get any litteral newline (and remove the sed call doing the
substitution in my patch).  Or detect them (with grep) and print an error?
Litteral newlines break badly config-host.mak anyway.
Stefan Weil - Oct. 6, 2013, 5:47 a.m.
Am 06.10.2013 00:18, schrieb Gabriel Kerneis:
> On Sun, Oct 06, 2013 at 12:54:08AM +0900, Peter Maydell wrote:
>> So this sed script appears to convert literal newlines in the input
>> Is that what's intended?
> Yes.
>
>> It doesn't seem very useful because if you cut-n-paste (or pipe)
>> 'hello\nworld' into a shell you get an actual backslash-n, not a newline.
> You're right.  Then the best is probably to expect that ./configure parameters
> will not get any litteral newline (and remove the sed call doing the
> substitution in my patch).  Or detect them (with grep) and print an error?
> Litteral newlines break badly config-host.mak anyway.
>


What about removing the comment with the configure parameters
from config-host.mak? Instead of that comment, we could write a
new file config.status as a script (executable) which can be called
to repeat the latest configuration.

This would have several benefits:

* Having the latest configuration in config.status is very common (GNU
autoconf).

* Easier code - no need to create a configure call from a comment.

* Users can call config.status if they want to repeat the configure process.

Regards,
Stefan
Gabriel Kerneis - Oct. 6, 2013, 7:25 a.m.
On Sun, Oct 06, 2013 at 07:47:02AM +0200, Stefan Weil wrote:
> What about removing the comment with the configure parameters
> from config-host.mak?

Sound like a good idea.

> * Easier code - no need to create a configure call from a comment.

Note we still need some escaping for single quotes, but Makefile would be
cleaner indeed.

I can send a new patch implementing this.

Patch

diff --git a/configure b/configure
index 23dbaaf..fba7c1f 100755
--- a/configure
+++ b/configure
@@ -3769,7 +3769,11 @@  echo "# Automatically generated by configure - do not modify" >config-all-disas.
 
 echo "# Automatically generated by configure - do not modify" > $config_host_mak
 printf "# Configured with:" >> $config_host_mak
-printf " '%s'" "$0" "$@" >> $config_host_mak
+for arg in "$0" "$@"; do
+  # join each arg on a single line, escaping newlines and single quotes
+  quoted_arg=$(echo "$arg" | sed ":a;N;s/\n/\\\\n/;ba" | sed "s/'/'\\\\''/g")
+  printf " '%s'" "$quoted_arg"
+done >> $config_host_mak
 echo >> $config_host_mak
 
 echo all: >> $config_host_mak