diff options
Diffstat (limited to 'package/busybox/patches/000-upstream-hush.patch')
-rw-r--r-- | package/busybox/patches/000-upstream-hush.patch | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/package/busybox/patches/000-upstream-hush.patch b/package/busybox/patches/000-upstream-hush.patch new file mode 100644 index 000000000..897372695 --- /dev/null +++ b/package/busybox/patches/000-upstream-hush.patch @@ -0,0 +1,119 @@ +--- a/shell/hush.c ++++ b/shell/hush.c +@@ -1853,7 +1853,7 @@ static void o_addblock_duplicate_backsla + 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( + 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 **ar + + 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_si + #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(cha + { + 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; +--- /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 +--- /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: $?" |