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
No binary (build failed)
—
(log yok)
| @@ -1219,8 +1219,13 @@ static int o_glob(o_string *o, int n) | |
| * Otherwise, just finish current list[] and start new */ | |
| static int o_save_ptr(o_string *o, int n) | |
| { | |
| - | if (o->o_glob) |
| - | return o_glob(o, n); /* o_save_ptr_helper is inside */ |
| + | if (o->o_glob) { /* if globbing is requested */ |
| + | /* If o->has_empty_slot, list[n] was already globbed |
| + | * (if it was requested back then when it was filled) |
| + | * so don't do that again! */ |
| + | if (!o->has_empty_slot) |
| + | return o_glob(o, n); /* o_save_ptr_helper is inside */ |
| + | } |
| return o_save_ptr_helper(o, n); | |
| } | |
| @@ -4285,6 +4290,11 @@ int hush_main(int argc, char **argv) | |
| switch (opt) { | |
| case 'c': | |
| G.global_argv = argv + optind; | |
| + | if (!argv[optind]) { |
| + | /* -c 'script' (no params): prevent empty $0 */ |
| + | *--G.global_argv = argv[0]; |
| + | optind--; |
| + | } /* else -c 'script' PAR0 PAR1: $0 is PAR0 */ |
| G.global_argc = argc - optind; | |
| opt = parse_and_run_string(optarg, 0 /* parse_flag */); | |
| goto final_return; | |
| @@ -1,2 +1,3 @@ | |
| Should be printed | |
| Should be printed | |
| + | Empty: |
| @@ -12,3 +12,6 @@ for a in "$@"""; do echo Should not be printed; done | |
| for a in """$@"; do echo Should not be printed; done | |
| for a in """$@"''"$@"''; do echo Should not be printed; done | |
| for a in ""; do echo Should be printed; done | |
| + | |
| + | # Bug 207: "$@" expands to nothing, and we erroneously glob "%s\\n" twice: |
| + | printf "Empty:%s\\n" "$@" |