diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2011-05-31 17:35:45 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2011-05-31 17:35:45 +0200 |
commit | 00ae989ee5b57593362405288b5e977551cafb0b (patch) | |
tree | 57d93dd050c292dbec819b166fd22f26fa21172c | |
parent | 14f55538f07f0b1493c713d84a046b9022fcf8fb (diff) | |
download | busybox-w32-00ae989ee5b57593362405288b5e977551cafb0b.tar.gz busybox-w32-00ae989ee5b57593362405288b5e977551cafb0b.tar.bz2 busybox-w32-00ae989ee5b57593362405288b5e977551cafb0b.zip |
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 <vda.linux@googlemail.com>
-rw-r--r-- | shell/hush.c | 5 | ||||
-rw-r--r-- | shell/hush_test/hush-misc/while3.right | 1 | ||||
-rwxr-xr-x | shell/hush_test/hush-misc/while3.tests | 4 |
3 files changed, 9 insertions, 1 deletions
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) | |||
7498 | #endif | 7498 | #endif |
7499 | #if ENABLE_HUSH_LOOPS | 7499 | #if ENABLE_HUSH_LOOPS |
7500 | /* Beware of "while false; true; do ..."! */ | 7500 | /* Beware of "while false; true; do ..."! */ |
7501 | if (pi->next && pi->next->res_word == RES_DO) { | 7501 | if (pi->next |
7502 | && (pi->next->res_word == RES_DO || pi->next->res_word == RES_DONE) | ||
7503 | /* (the second check above is needed for "while ...; do \n done" case) */ | ||
7504 | ) { | ||
7502 | if (rword == RES_WHILE) { | 7505 | if (rword == RES_WHILE) { |
7503 | if (rcode) { | 7506 | if (rcode) { |
7504 | /* "while false; do...done" - exitcode 0 */ | 7507 | /* "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 @@ | |||
1 | while false; do | ||
2 | # bash will require at least ":" here... | ||
3 | done | ||
4 | echo OK:$? | ||