ash: parser: Fix parameter expansion inside inner double quotes

Upstream email:

    parser: Fix parameter expansion inside inner double quotes

    The parsing of parameter expansion inside inner double quotes
    breaks because we never look for ENDVAR while innerdq is true.

            echo "${x#"${x+''}"''}

    This patch fixes it by pushing the syntax stack if innerdq is
    true and we enter a new parameter expansion.

    This patch also fixes a corner case where a bad substitution error
    occurs within arithmetic expansion.

    Reported-by: Denys Vlasenko <vda.linux@googlemail.com>
    Fixes: ab1cecb40478 (" parser: Add syntax stack for recursive...")
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

function                                             old     new   delta
readtoken1                                          2880    2898     +18

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2018-04-02 21:00:59 +02:00
parent abf755615e
commit f50e14632f
3 changed files with 8 additions and 2 deletions

View File

@ -12467,10 +12467,12 @@ parsesub: {
pungetc();
}
if (newsyn == ARISYNTAX && subtype > VSNORMAL)
if (newsyn == ARISYNTAX)
newsyn = DQSYNTAX;
if (newsyn != synstack->syntax) {
if ((newsyn != synstack->syntax || synstack->innerdq)
&& subtype != VSNORMAL
) {
synstack_push(&synstack,
synstack->prev ?: alloca(sizeof(*synstack)),
newsyn);

View File

@ -0,0 +1,2 @@
''
Ok:0

View File

@ -0,0 +1,2 @@
x="''''"; echo "${x#"${x+''}"''}"
echo Ok:$?