summary refs log tree commit diff
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2011-03-15 17:41:53 +0800
committerHerbert Xu <herbert@gondor.apana.org.au>2011-03-15 17:41:53 +0800
commitec2c84d3c4dba4b74440d72bdd1de416a9acd2a9 (patch)
treeba0dc60e76629ab37a243b7b57efcb0ed297a6e3
parent[DEBUG] Use va_copy when reusing a va_list (diff)
downloaddash-ec2c84d3c4dba4b74440d72bdd1de416a9acd2a9.tar.gz
dash-ec2c84d3c4dba4b74440d72bdd1de416a9acd2a9.zip
[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>
Diffstat (limited to '')
-rw-r--r--ChangeLog4
-rw-r--r--src/parser.c5
2 files changed, 7 insertions, 2 deletions
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 @@ 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))) {