[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 <jrnieder@gmail.com>
Signed-off-by: Herbert Xu <herbert@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 <herbert@gondor.apana.org.au>
+
+ * Fix clobbering of checkkwd.
+
2011-03-15 Jonathan Nieder <jrnieder@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 @@
readtoken(void)
{
int t;
+ int kwd = checkkwd;
#ifdef DEBUG
int alreadyseen = tokpushback;
#endif
@@ -697,7 +698,7 @@
/*
* eat newlines
*/
- if (checkkwd & CHKNL) {
+ if (kwd & CHKNL) {
while (t == TNL) {
parseheredoc();
t = xxreadtoken();
@@ -711,7 +712,7 @@
/*
* check for keywords
*/
- if (checkkwd & CHKKWD) {
+ if (kwd & CHKKWD) {
const char *const *pp;
if ((pp = findkwd(wordtext))) {