hush: fix bug 207 and "hush -c" parameter passing.
authorDenis Vlasenko <vda.linux@googlemail.com>
Fri, 20 Mar 2009 12:05:14 +0000 (12:05 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Fri, 20 Mar 2009 12:05:14 +0000 (12:05 -0000)
 Now hush -c 'printf "%s\n" "$@"' (prints "\n")
 and hush -c 'printf "%s\n" "$@"' qwe asd (prints "asd\n")
 both work correctly

shell/hush.c
shell/hush_test/hush-parsing/starquoted2.right
shell/hush_test/hush-parsing/starquoted2.tests

index e6189f841efe1fbc26054754f1e976f8b1f95ba8..bfd487cfb4e4f5d0c8f588d140d52bc17c545a65 100644 (file)
@@ -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;
index 46f24369e8f38877746f0de9521fbbe10c46d610..f4624dad59dbd267f5ce85322921b9258c48dd1f 100644 (file)
@@ -1,2 +1,3 @@
 Should be printed
 Should be printed
+Empty:
index 782d71b88148a87188ad9d86137be11f5e4cf716..3475edeb241b3b7141a8eae13b321269dd074d67 100755 (executable)
@@ -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" "$@"