summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2010-05-17 09:49:47 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2010-05-17 09:49:47 +0200
commit3227d3f982e809fd02b37d6274f1c7da0a307cea (patch)
tree91a012dc7a9fdf3016f2258e05d4588e2cb89bf1
parent0f01b00d742f92061cbbd9e95d1cd0368c4d2a4c (diff)
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>
-rw-r--r--shell/hush.c13
-rwxr-xr-xshell/hush_test/hush-bugs/parse_err.tests3
-rw-r--r--shell/hush_test/hush-parsing/group2.right (renamed from shell/hush_test/hush-bugs/parse_err.right)0
-rwxr-xr-xshell/hush_test/hush-parsing/group2.tests3
4 files changed, 12 insertions, 7 deletions
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
index df4d9306a..df4d9306a 100644
--- a/shell/hush_test/hush-bugs/parse_err.right
+++ b/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: $?