hush: fix a bug in argv restoration after sourcing a file
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 9 Jan 2017 07:13:21 +0000 (08:13 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 9 Jan 2017 07:13:21 +0000 (08:13 +0100)
if sourced file "shift"ed argvs so that $1 is NULL, restore wasn't done.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/ash_test/ash-misc/source_argv_and_shift.right [new file with mode: 0644]
shell/ash_test/ash-misc/source_argv_and_shift.tests [new file with mode: 0755]
shell/hush.c
shell/hush_test/hush-misc/source_argv_and_shift.right [new file with mode: 0644]
shell/hush_test/hush-misc/source_argv_and_shift.tests [new file with mode: 0755]

diff --git a/shell/ash_test/ash-misc/source_argv_and_shift.right b/shell/ash_test/ash-misc/source_argv_and_shift.right
new file mode 100644 (file)
index 0000000..b15cc96
--- /dev/null
@@ -0,0 +1,4 @@
+sourced_arg1:1
+arg1:
+sourced_arg1:a
+arg1:1
diff --git a/shell/ash_test/ash-misc/source_argv_and_shift.tests b/shell/ash_test/ash-misc/source_argv_and_shift.tests
new file mode 100755 (executable)
index 0000000..66353f3
--- /dev/null
@@ -0,0 +1,12 @@
+echo 'echo sourced_arg1:$1' >sourced1
+echo 'shift' >>sourced1
+
+set -- 1
+. ./sourced1
+echo arg1:$1
+
+set -- 1
+. ./sourced1 a
+echo arg1:$1
+
+rm sourced1
index c69e4ec8a2f629ee0a29e0bb5e4e5a97070ec060..5c5715b3ff8eb712e1ea6d517891b024bb3f0a72 100644 (file)
@@ -9606,6 +9606,7 @@ static int FAST_FUNC builtin_source(char **argv)
        char *arg_path, *filename;
        FILE *input;
        save_arg_t sv;
+       char *args_need_save;
 #if ENABLE_HUSH_FUNCTIONS
        smallint sv_flg;
 #endif
@@ -9637,7 +9638,8 @@ static int FAST_FUNC builtin_source(char **argv)
        /* "we are inside sourced file, ok to use return" */
        G_flag_return_in_progress = -1;
 #endif
-       if (argv[1])
+       args_need_save = argv[1]; /* used as a boolean variable */
+       if (args_need_save)
                save_and_replace_G_args(&sv, argv);
 
        /* "false; . ./empty_line; echo Zero:$?" should print 0 */
@@ -9645,7 +9647,7 @@ static int FAST_FUNC builtin_source(char **argv)
        parse_and_run_file(input);
        fclose_and_forget(input);
 
-       if (argv[1])
+       if (args_need_save) /* can't use argv[1] instead: "shift" can mangle it */
                restore_G_args(&sv, argv);
 #if ENABLE_HUSH_FUNCTIONS
        G_flag_return_in_progress = sv_flg;
diff --git a/shell/hush_test/hush-misc/source_argv_and_shift.right b/shell/hush_test/hush-misc/source_argv_and_shift.right
new file mode 100644 (file)
index 0000000..b15cc96
--- /dev/null
@@ -0,0 +1,4 @@
+sourced_arg1:1
+arg1:
+sourced_arg1:a
+arg1:1
diff --git a/shell/hush_test/hush-misc/source_argv_and_shift.tests b/shell/hush_test/hush-misc/source_argv_and_shift.tests
new file mode 100755 (executable)
index 0000000..66353f3
--- /dev/null
@@ -0,0 +1,12 @@
+echo 'echo sourced_arg1:$1' >sourced1
+echo 'shift' >>sourced1
+
+set -- 1
+. ./sourced1
+echo arg1:$1
+
+set -- 1
+. ./sourced1 a
+echo arg1:$1
+
+rm sourced1