The following patch is meant to be applied on top of:

https://patchwork.kernel.org/patch/11512439/

---8<---
This script should print OK:

        alias a="case x in " b=x
        a
        b) echo BAD;; esac

        alias BEGIN={ END=}
        BEGIN
                cat <<- EOF > /dev/null
                        $(:)
                EOF
        END

        : <<- EOF &&
                $(:)
        EOF
        BEGIN
                echo OK
        END

However, because the value of checkkwd is either zeroed when it
shouldn't, or isn't zeroed when it should, dash currently gets
it wrong in every case.

This patch fixes it by saving checkkwd and zeroing it where needed.

Suggested-by: Harald van Dijk <[email protected]>
Reported-by: Harald van Dijk <[email protected]>
Reported-by: Martijn Dekker <[email protected]>
Signed-off-by: Herbert Xu <[email protected]>

diff --git a/src/parser.c b/src/parser.c
index 5c9e9a0..be84f8b 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -704,10 +704,14 @@ top:
        if (kwd & CHKNL) {
                while (t == TNL) {
                        parseheredoc();
+                       checkkwd = 0;
                        t = xxreadtoken();
                }
        }
 
+       kwd |= checkkwd;
+       checkkwd = 0;
+
        if (t != TWORD || quoteflag) {
                goto out;
        }
@@ -725,7 +729,7 @@ top:
                }
        }
 
-       if (checkkwd & CHKALIAS) {
+       if (kwd & CHKALIAS) {
                struct alias *ap;
                if ((ap = lookupalias(wordtext, 1)) != NULL) {
                        if (*ap->val) {
@@ -735,7 +739,6 @@ top:
                }
        }
 out:
-       checkkwd = 0;
 #ifdef DEBUG
        if (!alreadyseen)
            TRACE(("token %s %s\n", tokname[t], t == TWORD ? wordtext : ""));
-- 
Email: Herbert Xu <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt

Reply via email to