On Sun, Nov 07, 2010 at 02:21:21AM +0000, Jonathan Nieder wrote:
> 
> Just ran into some strange behavior:

This patch should fix the problem.

commit ec2c84d3c4dba4b74440d72bdd1de416a9acd2a9
Author: Herbert Xu <herb...@gondor.apana.org.au>
Date:   Tue Mar 15 17:41:53 2011 +0800

    [PARSER] Fix clobbering of checkkwd
    
    On Sun, Nov 07, 2010 at 02:21:21AM +0000, Jonathan Nieder wrote:
    >
    > Just ran into some strange behavior:
    >
    > $ cat test.sh
    > #!/bin/sh
    > echo hello >greeting
    > cat <<EOF &&
    > $(cat greeting)
    > EOF
    > {
    >   echo $?
    >   cat greeting
    > } >/dev/null
    >
    >
    > $ sh test.sh
    > hello
    > test.sh: 7: {: not found
    > 127
    > hello
    > test.sh: 10: Syntax error: "}" unexpected
    >
    > bash, mksh, pdksh, and ksh93 all print hello as expected.  The problem
    > is reproducible with all versions of dash in the git repo.
    
    This is caused by the clobbering of checkkwd due to readtoken
    recursion while parsing a here document.
    
    This patch fixes it by saving the original value of checkkwd.
    
    Reported-by: Jonathan Nieder <jrnie...@gmail.com>
    Signed-off-by: Herbert Xu <herb...@gondor.apana.org.au>

diff --git a/ChangeLog b/ChangeLog
index 5b6d53e..50a8044 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2011-03-15  Herbert Xu <herb...@gondor.apana.org.au>
+
+       * Fix clobbering of checkkwd.
+
 2011-03-15  Jonathan Nieder <jrnie...@gmail.com>
 
        * Free IFS state after here document expansion.
diff --git a/src/parser.c b/src/parser.c
index 0bfd620..528d005 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -687,6 +687,7 @@ STATIC int
 readtoken(void)
 {
        int t;
+       int kwd = checkkwd;
 #ifdef DEBUG
        int alreadyseen = tokpushback;
 #endif
@@ -697,7 +698,7 @@ top:
        /*
         * eat newlines
         */
-       if (checkkwd & CHKNL) {
+       if (kwd & CHKNL) {
                while (t == TNL) {
                        parseheredoc();
                        t = xxreadtoken();
@@ -711,7 +712,7 @@ top:
        /*
         * check for keywords
         */
-       if (checkkwd & CHKKWD) {
+       if (kwd & CHKKWD) {
                const char *const *pp;
 
                if ((pp = findkwd(wordtext))) {

Cheers,
-- 
Email: Herbert Xu <herb...@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
--
To unsubscribe from this list: send the line "unsubscribe dash" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to