From 3227d3f982e809fd02b37d6274f1c7da0a307cea Mon Sep 17 00:00:00 2001 From: Denys Vlasenko 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 --- 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: $?