From 3227d3f982e809fd02b37d6274f1c7da0a307cea Mon Sep 17 00:00:00 2001
From: Denys Vlasenko <vda.linux@googlemail.com>
Date: Mon, 17 May 2010 09:49:47 +0200
Subject: [PATCH] hush: fix hush-bugs/parse_err.tests

function                                             old     new   delta
parse_stream                                        2325    2339     +14
builtin_umask                                        121     123      +2
builtin_type                                         116     114      -2

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
---
 shell/hush.c                                        | 13 +++++++++----
 shell/hush_test/hush-bugs/parse_err.tests           |  3 ---
 .../parse_err.right => hush-parsing/group2.right}   |  0
 shell/hush_test/hush-parsing/group2.tests           |  3 +++
 4 files changed, 12 insertions(+), 7 deletions(-)
 delete mode 100755 shell/hush_test/hush-bugs/parse_err.tests
 rename shell/hush_test/{hush-bugs/parse_err.right => hush-parsing/group2.right} (100%)
 create mode 100755 shell/hush_test/hush-parsing/group2.tests

diff --git a/shell/hush.c b/shell/hush.c
index 07cacbfc9..1bc0c611d 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -6232,10 +6232,15 @@ static struct pipe *parse_stream(char **pstring,
 		is_special = "{}<>;&|()#'" /* special outside of "str" */
 				"\\$\"" IF_HUSH_TICK("`"); /* always special */
 		/* Are { and } special here? */
-		if (ctx.command->argv /* word [word]{... */
-		 || dest.length /* word{... */
-		 || dest.o_quoted /* ""{... */
-		 || (next != ';' && next != ')' && !strchr(G.ifs, next)) /* {word */
+		if (ctx.command->argv /* word [word]{... - non-special */
+		 || dest.length       /* word{... - non-special */
+		 || dest.o_quoted     /* ""{... - non-special */
+		 || (next != ';'            /* }; - special */
+		    && next != ')'          /* }) - special */
+		    && next != '&'          /* }& and }&& ... - special */
+		    && next != '|'          /* }|| ... - special */
+		    && !strchr(G.ifs, next) /* {word - non-special */
+		    )
 		) {
 			/* They are not special, skip "{}" */
 			is_special += 2;
diff --git a/shell/hush_test/hush-bugs/parse_err.tests b/shell/hush_test/hush-bugs/parse_err.tests
deleted file mode 100755
index dd7d9ad64..000000000
--- a/shell/hush_test/hush-bugs/parse_err.tests
+++ /dev/null
@@ -1,3 +0,0 @@
-# Bug happens only if there is no space in "}&"
-{ trap "echo got TERM" TERM; sleep 3; }& sleep 1; kill $!; wait
-echo Done: $?
diff --git a/shell/hush_test/hush-bugs/parse_err.right b/shell/hush_test/hush-parsing/group2.right
similarity index 100%
rename from shell/hush_test/hush-bugs/parse_err.right
rename to shell/hush_test/hush-parsing/group2.right
diff --git a/shell/hush_test/hush-parsing/group2.tests b/shell/hush_test/hush-parsing/group2.tests
new file mode 100755
index 000000000..d99178585
--- /dev/null
+++ b/shell/hush_test/hush-parsing/group2.tests
@@ -0,0 +1,3 @@
+# Bug was in handling of "}&" without space
+{ trap "echo got TERM" TERM; sleep 2; }& sleep 1; kill $!; wait
+echo Done: $?
-- 
2.25.1