[git commit] hush: fix a corner case of empty "do \n done" structure

Denys Vlasenko vda.linux at googlemail.com
Tue May 31 15:35:45 UTC 2011


commit: http://git.busybox.net/busybox/commit/?id=00ae989ee5b57593362405288b5e977551cafb0b
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

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 at googlemail.com>
---
 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 deletions(-)
 create mode 100644 shell/hush_test/hush-misc/while3.right
 create mode 100755 shell/hush_test/hush-misc/while3.tests

diff --git a/shell/hush.c b/shell/hush.c
index c3a4afb..c7971b0 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 0000000..7c4d7be
--- /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 0000000..9132b5f
--- /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:$?
-- 
1.7.3.4



More information about the busybox-cvs mailing list