hush: fix hush-bugs/parse_err.tests
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 17 May 2010 07:49:47 +0000 (09:49 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 17 May 2010 07:49:47 +0000 (09:49 +0200)
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
shell/hush_test/hush-bugs/parse_err.right [deleted file]
shell/hush_test/hush-bugs/parse_err.tests [deleted file]
shell/hush_test/hush-parsing/group2.right [new file with mode: 0644]
shell/hush_test/hush-parsing/group2.tests [new file with mode: 0755]

index 07cacbfc9b8d465039feb4c6251afafb741d01b7..1bc0c611dc56f6c5b47218fba1211476cde08b05 100644 (file)
@@ -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.right b/shell/hush_test/hush-bugs/parse_err.right
deleted file mode 100644 (file)
index df4d930..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-got TERM
-Done: 0
diff --git a/shell/hush_test/hush-bugs/parse_err.tests b/shell/hush_test/hush-bugs/parse_err.tests
deleted file mode 100755 (executable)
index dd7d9ad..0000000
+++ /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-parsing/group2.right b/shell/hush_test/hush-parsing/group2.right
new file mode 100644 (file)
index 0000000..df4d930
--- /dev/null
@@ -0,0 +1,2 @@
+got TERM
+Done: 0
diff --git a/shell/hush_test/hush-parsing/group2.tests b/shell/hush_test/hush-parsing/group2.tests
new file mode 100755 (executable)
index 0000000..d991785
--- /dev/null
@@ -0,0 +1,3 @@
+# Bug was in handling of "}&" without space
+{ trap "echo got TERM" TERM; sleep 2; }& sleep 1; kill $!; wait
+echo Done: $?