ash: parser: Fix single-quoted patterns in here-documents
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 2 Apr 2018 11:29:20 +0000 (13:29 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 2 Apr 2018 11:29:20 +0000 (13:29 +0200)
Upstream commit:

    From: Herbert Xu <herbert@gondor.apana.org.au>
    Date: Fri, 9 Mar 2018 23:07:53 +0800
    parser: Fix single-quoted patterns in here-documents

    The script

            x=*
            cat <<- EOF
                    ${x#'*'}
            EOF

    prints * instead of nothing as it should.  The problem is that
    when we're in sqsyntax context in a here-document, we won't add
    CTLESC as we should.  This patch fixes it:

Reported-by: Harald van Dijk <harald@gigawatt.nl>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/ash.c
shell/ash_test/ash-heredoc/heredoc_var_expand1.right [new file with mode: 0644]
shell/ash_test/ash-heredoc/heredoc_var_expand1.tests [new file with mode: 0755]

index 97379cd920429be3f2b4aeca5eafc73a14a1d03b..70a278f42e34b37a6c65c805a0e6a3f5b7736fc9 100644 (file)
@@ -12005,7 +12005,7 @@ readtoken1(int c, int syntax, char *eofmark, int striptabs)
                                }
                        }
 #endif
-                       if (eofmark == NULL || synstack->dblquote)
+                       if (!eofmark || synstack->dblquote || synstack->varnest)
                                USTPUTC(CTLESC, out);
                        USTPUTC(c, out);
                        break;
diff --git a/shell/ash_test/ash-heredoc/heredoc_var_expand1.right b/shell/ash_test/ash-heredoc/heredoc_var_expand1.right
new file mode 100644 (file)
index 0000000..eb22183
--- /dev/null
@@ -0,0 +1,4 @@
+
+Ok1:0
+
+Ok2:0
diff --git a/shell/ash_test/ash-heredoc/heredoc_var_expand1.tests b/shell/ash_test/ash-heredoc/heredoc_var_expand1.tests
new file mode 100755 (executable)
index 0000000..3b00bab
--- /dev/null
@@ -0,0 +1,11 @@
+x='*'
+
+cat <<- EOF
+       ${x#'*'}
+EOF
+echo Ok1:$?
+
+cat <<EOF
+${x#'*'}
+EOF
+echo Ok2:$?