hush: fix a corner case of empty "do \n done" structure
authorDenys Vlasenko <vda.linux@googlemail.com>
Tue, 31 May 2011 15:35:45 +0000 (17:35 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 31 May 2011 15:35:45 +0000 (17:35 +0200)
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>
shell/hush.c
shell/hush_test/hush-misc/while3.right [new file with mode: 0644]
shell/hush_test/hush-misc/while3.tests [new file with mode: 0755]

index c3a4afb5a2d9c5a27bca45157438e1709a8eeab2..c7971b0ce86ff344a1f13850d978965c19d2af9d 100644 (file)
@@ -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 (file)
index 0000000..7c4d7be
--- /dev/null
@@ -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 (executable)
index 0000000..9132b5f
--- /dev/null
@@ -0,0 +1,4 @@
+while false; do
+    # bash will require at least ":" here...
+done
+echo OK:$?