diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2011-05-31 19:35:45 +0400 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2011-05-31 19:35:45 +0400 |
commit | 00ae989ee5b57593362405288b5e977551cafb0b (patch) | |
tree | 57d93dd050c292dbec819b166fd22f26fa21172c /shell/hush.c | |
parent | 14f55538f07f0b1493c713d84a046b9022fcf8fb (diff) |
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>
Diffstat (limited to 'shell/hush.c')
-rw-r--r-- | shell/hush.c | 5 |
1 files changed, 4 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) #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 */ |