aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2009-03-20 12:05:14 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2009-03-20 12:05:14 +0000
commita8b6dff97f353c41e208e7e567f100a6c7af4605 (patch)
tree6a6722ac176e2f04261bf29202e87767c3d9349e
parent5368ad53e91ee056316389b5006b7eb0df2f2d11 (diff)
downloadbusybox-w32-a8b6dff97f353c41e208e7e567f100a6c7af4605.tar.gz
busybox-w32-a8b6dff97f353c41e208e7e567f100a6c7af4605.tar.bz2
busybox-w32-a8b6dff97f353c41e208e7e567f100a6c7af4605.zip
hush: fix bug 207 and "hush -c" parameter passing.
Now hush -c 'printf "%s\n" "$@"' (prints "\n") and hush -c 'printf "%s\n" "$@"' qwe asd (prints "asd\n") both work correctly
-rw-r--r--shell/hush.c14
-rw-r--r--shell/hush_test/hush-parsing/starquoted2.right1
-rwxr-xr-xshell/hush_test/hush-parsing/starquoted2.tests3
3 files changed, 16 insertions, 2 deletions
diff --git a/shell/hush.c b/shell/hush.c
index e6189f841..bfd487cfb 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -1219,8 +1219,13 @@ static int o_glob(o_string *o, int n)
1219 * Otherwise, just finish current list[] and start new */ 1219 * Otherwise, just finish current list[] and start new */
1220static int o_save_ptr(o_string *o, int n) 1220static int o_save_ptr(o_string *o, int n)
1221{ 1221{
1222 if (o->o_glob) 1222 if (o->o_glob) { /* if globbing is requested */
1223 return o_glob(o, n); /* o_save_ptr_helper is inside */ 1223 /* If o->has_empty_slot, list[n] was already globbed
1224 * (if it was requested back then when it was filled)
1225 * so don't do that again! */
1226 if (!o->has_empty_slot)
1227 return o_glob(o, n); /* o_save_ptr_helper is inside */
1228 }
1224 return o_save_ptr_helper(o, n); 1229 return o_save_ptr_helper(o, n);
1225} 1230}
1226 1231
@@ -4285,6 +4290,11 @@ int hush_main(int argc, char **argv)
4285 switch (opt) { 4290 switch (opt) {
4286 case 'c': 4291 case 'c':
4287 G.global_argv = argv + optind; 4292 G.global_argv = argv + optind;
4293 if (!argv[optind]) {
4294 /* -c 'script' (no params): prevent empty $0 */
4295 *--G.global_argv = argv[0];
4296 optind--;
4297 } /* else -c 'script' PAR0 PAR1: $0 is PAR0 */
4288 G.global_argc = argc - optind; 4298 G.global_argc = argc - optind;
4289 opt = parse_and_run_string(optarg, 0 /* parse_flag */); 4299 opt = parse_and_run_string(optarg, 0 /* parse_flag */);
4290 goto final_return; 4300 goto final_return;
diff --git a/shell/hush_test/hush-parsing/starquoted2.right b/shell/hush_test/hush-parsing/starquoted2.right
index 46f24369e..f4624dad5 100644
--- a/shell/hush_test/hush-parsing/starquoted2.right
+++ b/shell/hush_test/hush-parsing/starquoted2.right
@@ -1,2 +1,3 @@
1Should be printed 1Should be printed
2Should be printed 2Should be printed
3Empty:
diff --git a/shell/hush_test/hush-parsing/starquoted2.tests b/shell/hush_test/hush-parsing/starquoted2.tests
index 782d71b88..3475edeb2 100755
--- a/shell/hush_test/hush-parsing/starquoted2.tests
+++ b/shell/hush_test/hush-parsing/starquoted2.tests
@@ -12,3 +12,6 @@ for a in "$@"""; do echo Should not be printed; done
12for a in """$@"; do echo Should not be printed; done 12for a in """$@"; do echo Should not be printed; done
13for a in """$@"''"$@"''; do echo Should not be printed; done 13for a in """$@"''"$@"''; do echo Should not be printed; done
14for a in ""; do echo Should be printed; done 14for a in ""; do echo Should be printed; done
15
16# Bug 207: "$@" expands to nothing, and we erroneously glob "%s\\n" twice:
17printf "Empty:%s\\n" "$@"