[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: escape strings in grub.cfg
From: |
Colin Watson |
Subject: |
Re: escape strings in grub.cfg |
Date: |
Mon, 12 Apr 2010 01:09:06 +0100 |
User-agent: |
Mutt/1.5.18 (2008-05-17) |
On Sat, Apr 10, 2010 at 10:10:15PM +0100, Carles Pina i Estany wrote:
> Last weekend, the Asturian team found a bug in Grub. Thanks for the
> debugging. The string that appears in grub.cfg for "Loading the initram"
> in Asturian is "Cargando'l discu RAM inicial...". So grub.cfg looks
> like:
> echo Cargando'l discu RAM inicial...
>
> This is syntactically invalid because the character "'".
>
> Easy work around: generate the line like:
> echo "Cargando'l discu RAM inicial..."
>
> New problem: in some language, this string could have a double quote
> inside.
>
> New solution: escape the double quotes strings when they are used in
> gettext and always use these strings with double quotes.
>
> See the attached patch.
>
> I'm not convinced of the patch, does anybody has a cleaner idea/patch?
This doesn't cover everything - you've just moved the goalposts a bit.
Here's the relevant bit of the lexer:
<SQUOTE>{
\' {
yy_pop_state (yyscanner);
ARG (GRUB_SCRIPT_ARG_TYPE_SQSTR);
}
[^\']+ { COPY (yytext, yyleng); }
}
<DQUOTE>{
\" {
yy_pop_state (yyscanner);
ARG (GRUB_SCRIPT_ARG_TYPE_DQSTR);
}
\$ {
yy_push_state (VAR, yyscanner);
ARG (GRUB_SCRIPT_ARG_TYPE_DQSTR);
}
\\\\ { COPY ("\\", 1); }
\\\" { COPY ("\"", 1); }
\\\n { /* ignore */ }
[^\"$\\\n]+ { COPY (yytext, yyleng); }
(.|\n) { COPY (yytext, yyleng); }
}
In other words, only ' is special (as a terminator) when reading a
single-quoted string, and the sequences " $ \\ \" \n are special inside
a double-quoted string. (Incidentally, I think there's another bug
here; if $ is special, \$ should be special as well.)
Given this, wouldn't you be better off using single-quotes instead?
You'd then end up with:
echo 'Cargando'\''l discu RAM inicial...'
... where the construction used to escape ' is "close quotes, literal ',
reopen quotes". (Tested in grub-emu.)
> +gettext_escape_double_quotes ()
> +{
> + echo -n $(gettext $@) | sed 's/\"/\\\"/'
> +}
This is underquoted, and in any case the 'echo -n' is redundant since
gettext itself already writes to standard output and $() substitution
strips trailing newlines. $@ requires special treatment, and that sed
s/// command needs /g. With my suggestion, I'd recommend:
gettext_quoted () {
gettext "$@" | sed "s/'/'\\\\''/g"
}
... and then make sure it's enclosed in '' rather than "" wherever it's
used (or modify the sed to put single-quotes at the start and end, if
that works out neater).
--
Colin Watson address@hidden