diff options
author | Denis Vlasenko | 2008-07-29 13:36:09 +0000 |
---|---|---|
committer | Denis Vlasenko | 2008-07-29 13:36:09 +0000 |
commit | 4554b721ad230cdb5308b9ee61c20729c2c34ae8 (patch) | |
tree | fc7e114b9d54e4d8090f106acb31d1f7fe3f2320 | |
parent | 45cb9f9581f514e1fc731d6d1146e0ee2333066a (diff) | |
download | busybox-4554b721ad230cdb5308b9ee61c20729c2c34ae8.zip busybox-4554b721ad230cdb5308b9ee61c20729c2c34ae8.tar.gz |
hush: small fix for repeated continue and fix for wrong loop depth count
after Ctrl-C; with testcase for first one
-rw-r--r-- | shell/hush.c | 6 | ||||
-rw-r--r-- | shell/hush_test/hush-misc/continue1.right | 8 | ||||
-rwxr-xr-x | shell/hush_test/hush-misc/continue1.tests | 4 |
3 files changed, 17 insertions, 1 deletions
diff --git a/shell/hush.c b/shell/hush.c index a2649d0..ab067dd 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -2131,6 +2131,8 @@ static int run_list(struct pipe *pi) /* ctrl-C. We just stop doing whatever we were doing */ bb_putchar('\n'); } + loop_top = NULL; + depth_of_loop = 0; rcode = 0; goto ret; } @@ -2152,7 +2154,9 @@ static int run_list(struct pipe *pi) debug_printf_exec(": rword=%d cond_code=%d skip_more=%d\n", rword, cond_code, skip_more_for_this_rword); #if ENABLE_HUSH_LOOPS - if (rword == RES_WHILE || rword == RES_UNTIL || rword == RES_FOR) { + if ((rword == RES_WHILE || rword == RES_UNTIL || rword == RES_FOR) + && loop_top == NULL /* avoid bumping depth_of_loop twice */ + ) { /* start of a loop: remember where loop starts */ loop_top = pi; depth_of_loop++; diff --git a/shell/hush_test/hush-misc/continue1.right b/shell/hush_test/hush-misc/continue1.right new file mode 100644 index 0000000..c4a5565 --- /dev/null +++ b/shell/hush_test/hush-misc/continue1.right @@ -0,0 +1,8 @@ +A:a +A:b +A:c +OK1 +A:a +A:b +A:c +OK2 diff --git a/shell/hush_test/hush-misc/continue1.tests b/shell/hush_test/hush-misc/continue1.tests new file mode 100755 index 0000000..72d3566 --- /dev/null +++ b/shell/hush_test/hush-misc/continue1.tests @@ -0,0 +1,4 @@ +for v in a b c; do echo A:$v; continue 666; done +echo OK1 +for v in a b c; do echo A:$v; continue 666; done +echo OK2 |