diff options
Diffstat (limited to 'shell')
-rw-r--r-- | shell/hush.c | 30 | ||||
-rw-r--r-- | shell/hush_test/hush-vars/var_unbackslash.right | 9 | ||||
-rwxr-xr-x | shell/hush_test/hush-vars/var_unbackslash.tests | 20 |
3 files changed, 46 insertions, 13 deletions
diff --git a/shell/hush.c b/shell/hush.c index 01bc96c..3665e40 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -1853,7 +1853,7 @@ static void o_addblock_duplicate_backslash(o_string *o, const char *str, int len while (len) { o_addchr(o, *str); if (*str++ == '\\' - && (*str != '*' && *str != '?' && *str != '[') +// && (*str != '*' && *str != '?' && *str != '[') ) { o_addchr(o, '\\'); } @@ -2834,18 +2834,22 @@ static NOINLINE int expand_vars_to_list(o_string *output, int n, char *arg, char return n; } -static char **expand_variables(char **argv, int or_mask) +enum { + EXPVAR_FLAG_GLOB = 0x200, + EXPVAR_FLAG_ESCAPE_VARS = 0x100, + EXPVAR_FLAG_SINGLEWORD = 0x80, /* must be 0x80 */ +}; +static char **expand_variables(char **argv, unsigned or_mask) { int n; char **list; char **v; o_string output = NULL_O_STRING; - if (or_mask & 0x100) { - output.o_escape = 1; /* protect against globbing for "$var" */ - /* (unquoted $var will temporarily switch it off) */ - output.o_glob = 1; - } + /* protect against globbing for "$var"? */ + /* (unquoted $var will temporarily switch it off) */ + output.o_escape = 1 & (or_mask / EXPVAR_FLAG_ESCAPE_VARS); + output.o_glob = 1 & (or_mask / EXPVAR_FLAG_GLOB); n = 0; v = argv; @@ -2863,13 +2867,13 @@ static char **expand_variables(char **argv, int or_mask) static char **expand_strvec_to_strvec(char **argv) { - return expand_variables(argv, 0x100); + return expand_variables(argv, EXPVAR_FLAG_GLOB | EXPVAR_FLAG_ESCAPE_VARS); } #if ENABLE_HUSH_BASH_COMPAT static char **expand_strvec_to_strvec_singleword_noglob(char **argv) { - return expand_variables(argv, 0x80); + return expand_variables(argv, EXPVAR_FLAG_SINGLEWORD); } #endif @@ -2909,15 +2913,15 @@ static char **expand_strvec_to_strvec_singleword_noglob_cond(char **argv) #endif /* Used for expansion of right hand of assignments */ -/* NB: should NOT do globbing! "export v=/bin/c*; env | grep ^v=" outputs - * "v=/bin/c*" */ +/* NB: should NOT do globbing! + * "export v=/bin/c*; env | grep ^v=" outputs "v=/bin/c*" */ static char *expand_string_to_string(const char *str) { char *argv[2], **list; argv[0] = (char*)str; argv[1] = NULL; - list = expand_variables(argv, 0x80); /* 0x80: singleword expansion */ + list = expand_variables(argv, EXPVAR_FLAG_ESCAPE_VARS | EXPVAR_FLAG_SINGLEWORD); if (HUSH_DEBUG) if (!list[0] || list[1]) bb_error_msg_and_die("BUG in varexp2"); @@ -2933,7 +2937,7 @@ static char* expand_strvec_to_string(char **argv) { char **list; - list = expand_variables(argv, 0x80); + list = expand_variables(argv, EXPVAR_FLAG_SINGLEWORD); /* Convert all NULs to spaces */ if (list[0]) { int n = 1; diff --git a/shell/hush_test/hush-vars/var_unbackslash.right b/shell/hush_test/hush-vars/var_unbackslash.right new file mode 100644 index 0000000..c480792 --- /dev/null +++ b/shell/hush_test/hush-vars/var_unbackslash.right @@ -0,0 +1,9 @@ +b1=-qwerty-t-\-"---z-*-?- +b1=-qwerty-t-\-"---z-*-?- +b2=-$a-\t-\\-\"-\--\z-\*-\?- +b2=-$a-\t-\\-\"-\--\z-\*-\?- +c=-$a-\t-\\-\"-\--\z-\*-\?- +c=-$a-\t-\\-\"-\--\z-\*-\?- +c=-$a-\t-\\-\"-\--\z-\*-\?- +c=-$a-\t-\\-\"-\--\z-\*-\?- +Done: 0 diff --git a/shell/hush_test/hush-vars/var_unbackslash.tests b/shell/hush_test/hush-vars/var_unbackslash.tests new file mode 100755 index 0000000..2377cd5 --- /dev/null +++ b/shell/hush_test/hush-vars/var_unbackslash.tests @@ -0,0 +1,20 @@ +# Test for correct handling of backslashes +a=qwerty + +b=-$a-\t-\\-\"-\--\z-\*-\?- +echo b1=$b +echo "b1=$b" +b='-$a-\t-\\-\"-\--\z-\*-\?-' +echo b2=$b +echo "b2=$b" + +c=$b +echo "c=$c" +c=${b} +echo "c=$c" +c="$b" +echo "c=$c" +c="${b}" +echo "c=$c" + +echo "Done: $?" |