hush: fix a bug in argv restoration after sourcing a file

if sourced file "shift"ed argvs so that $1 is NULL, restore wasn't done.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2017-01-09 08:13:21 +01:00
parent 4e4f88e569
commit 2b1559056c
5 changed files with 36 additions and 2 deletions

View File

@ -0,0 +1,4 @@
sourced_arg1:1
arg1:
sourced_arg1:a
arg1:1

View File

@ -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

View 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;

View File

@ -0,0 +1,4 @@
sourced_arg1:1
arg1:
sourced_arg1:a
arg1:1

View File

@ -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