From 00ae989ee5b57593362405288b5e977551cafb0b Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 31 May 2011 17:35:45 +0200 Subject: hush: fix a corner case of empty "do \n done" structure The structure is: while cmd; do done bash doesn't accept it at all. We were accepting it but execution was buggy. Signed-off-by: Denys Vlasenko --- shell/hush.c | 5 ++++- shell/hush_test/hush-misc/while3.right | 1 + shell/hush_test/hush-misc/while3.tests | 4 ++++ 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 shell/hush_test/hush-misc/while3.right create mode 100755 shell/hush_test/hush-misc/while3.tests (limited to 'shell') diff --git a/shell/hush.c b/shell/hush.c index c3a4afb5a..c7971b0ce 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -7498,7 +7498,10 @@ static int run_list(struct pipe *pi) #endif #if ENABLE_HUSH_LOOPS /* Beware of "while false; true; do ..."! */ - if (pi->next && pi->next->res_word == RES_DO) { + if (pi->next + && (pi->next->res_word == RES_DO || pi->next->res_word == RES_DONE) + /* (the second check above is needed for "while ...; do \n done" case) */ + ) { if (rword == RES_WHILE) { if (rcode) { /* "while false; do...done" - exitcode 0 */ diff --git a/shell/hush_test/hush-misc/while3.right b/shell/hush_test/hush-misc/while3.right new file mode 100644 index 000000000..7c4d7beb0 --- /dev/null +++ b/shell/hush_test/hush-misc/while3.right @@ -0,0 +1 @@ +OK:0 diff --git a/shell/hush_test/hush-misc/while3.tests b/shell/hush_test/hush-misc/while3.tests new file mode 100755 index 000000000..9132b5f4d --- /dev/null +++ b/shell/hush_test/hush-misc/while3.tests @@ -0,0 +1,4 @@ +while false; do + # bash will require at least ":" here... +done +echo OK:$? -- cgit v1.2.3