diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-07-20 17:36:06 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-07-20 17:36:06 +0200 |
commit | 83e434d5b56baccf617ebcc8a752959f7c4aacfc (patch) | |
tree | 46a311ce40ba3f2e444d6cbf0c306351393498bf | |
parent | 294eb4612cd668521faa48711297196f00af61d9 (diff) | |
download | busybox-83e434d5b56baccf617ebcc8a752959f7c4aacfc.tar.gz |
hush: fix handling of '' in ${var:+ARG}
This wasn't an ash bug in dollar_altvalue9, it was hush bug (and bash!)
function old new delta
expand_one_var 2236 2254 +18
expand_vars_to_list 1097 1103 +6
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 24/0) Total: 24 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | shell/ash_test/ash-quoting/dollar_altvalue2.right | 69 | ||||
-rwxr-xr-x | shell/ash_test/ash-quoting/dollar_altvalue2.tests | 33 | ||||
-rw-r--r-- | shell/ash_test/ash-quoting/dollar_altvalue9.right | 2 | ||||
-rw-r--r-- | shell/hush.c | 12 | ||||
-rw-r--r-- | shell/hush_test/hush-quoting/dollar_altvalue2.right | 69 | ||||
-rwxr-xr-x | shell/hush_test/hush-quoting/dollar_altvalue2.tests | 33 | ||||
-rw-r--r-- | shell/hush_test/hush-quoting/dollar_altvalue9.right | 2 |
7 files changed, 217 insertions, 3 deletions
diff --git a/shell/ash_test/ash-quoting/dollar_altvalue2.right b/shell/ash_test/ash-quoting/dollar_altvalue2.right new file mode 100644 index 000000000..7cf37e379 --- /dev/null +++ b/shell/ash_test/ash-quoting/dollar_altvalue2.right @@ -0,0 +1,69 @@ +Unquoted '': +start: +|| +end +start: +|| +end +start: +|| +end +start: +|| +end +start: +|| +|| +end + +Unquoted "": +start: +|| +end +start: +|| +end +start: +|| +end +start: +|| +end +start: +|| +|| +end + +Quoted '': +start: +|''| +end +start: +|'' | +end +start: +| ''| +end +start: +| '' | +end +start: +|'' ''| +end + +Quoted "": +start: +|| +end +start: +| | +end +start: +| | +end +start: +| | +end +start: +| | +end diff --git a/shell/ash_test/ash-quoting/dollar_altvalue2.tests b/shell/ash_test/ash-quoting/dollar_altvalue2.tests new file mode 100755 index 000000000..3377eb27f --- /dev/null +++ b/shell/ash_test/ash-quoting/dollar_altvalue2.tests @@ -0,0 +1,33 @@ +f() { echo start:; for i; do echo "|$i|"; done; echo end; } +x=a + +echo "Unquoted '':" +f ${x:+''} +f ${x:+'' } +f ${x:+ ''} +f ${x:+ '' } +f ${x:+'' ''} + +echo +echo 'Unquoted "":' +f ${x:+""} +f ${x:+"" } +f ${x:+ ""} +f ${x:+ "" } +f ${x:+"" ""} + +echo +echo "Quoted '':" +f "${x:+''}" +f "${x:+'' }" +f "${x:+ ''}" +f "${x:+ '' }" +f "${x:+'' ''}" + +echo +echo 'Quoted "":' +f "${x:+""}" +f "${x:+"" }" +f "${x:+ ""}" +f "${x:+ "" }" +f "${x:+"" ""}" diff --git a/shell/ash_test/ash-quoting/dollar_altvalue9.right b/shell/ash_test/ash-quoting/dollar_altvalue9.right index fc6c2697c..39342fe7c 100644 --- a/shell/ash_test/ash-quoting/dollar_altvalue9.right +++ b/shell/ash_test/ash-quoting/dollar_altvalue9.right @@ -3,6 +3,7 @@ Unquoted 1: |x y| |1| |2| +|| |1 2| |A| |B| @@ -14,6 +15,7 @@ Unquoted 2: |ax y| |1| |2| +|| |1 2| |A| |B| diff --git a/shell/hush.c b/shell/hush.c index fc77b89fc..559595d2e 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -475,7 +475,6 @@ #endif #define SPECIAL_VAR_SYMBOL_STR "\3" -#define SPECIAL_VAR_SYMBOL_CHR '\3' #define SPECIAL_VAR_SYMBOL 3 /* The "variable" with name "\1" emits string "\3". Testcase: "echo ^C" */ #define SPECIAL_VAR_QUOTED_SVS 1 @@ -5950,6 +5949,8 @@ static int encode_then_append_var_plusminus(o_string *output, int n, break; o_addqchr(&dest, ch); } + o_addchr(&dest, SPECIAL_VAR_SYMBOL); + o_addchr(&dest, SPECIAL_VAR_SYMBOL); continue; } } @@ -5959,6 +5960,10 @@ static int encode_then_append_var_plusminus(o_string *output, int n, } if (ch == '"') { dest.o_expflags ^= EXP_FLAG_ESC_GLOB_CHARS; + if (dest.o_expflags) { + o_addchr(&dest, SPECIAL_VAR_SYMBOL); + o_addchr(&dest, SPECIAL_VAR_SYMBOL); + } continue; } if (ch == '\\') { @@ -6565,7 +6570,7 @@ static NOINLINE int expand_vars_to_list(o_string *output, int n, char *arg) case SPECIAL_VAR_QUOTED_SVS: /* <SPECIAL_VAR_SYMBOL><SPECIAL_VAR_QUOTED_SVS><SPECIAL_VAR_SYMBOL> */ /* "^C variable", represents literal ^C char (possible in scripts) */ - o_addchr(output, SPECIAL_VAR_SYMBOL_CHR); + o_addchr(output, SPECIAL_VAR_SYMBOL); arg++; break; #if ENABLE_HUSH_TICK @@ -6627,7 +6632,8 @@ static NOINLINE int expand_vars_to_list(o_string *output, int n, char *arg) o_addstr(output, arg); debug_print_list("expand_vars_to_list[b]", output, n); } else if (output->length == o_get_last_ptr(output, n) /* expansion is empty */ - && !(cant_be_null & 0x80) /* and all vars were not quoted. */ + && !(cant_be_null & 0x80) /* and all vars were not quoted */ + && !output->has_quoted_part ) { n--; /* allow to reuse list[n] later without re-growth */ diff --git a/shell/hush_test/hush-quoting/dollar_altvalue2.right b/shell/hush_test/hush-quoting/dollar_altvalue2.right new file mode 100644 index 000000000..7cf37e379 --- /dev/null +++ b/shell/hush_test/hush-quoting/dollar_altvalue2.right @@ -0,0 +1,69 @@ +Unquoted '': +start: +|| +end +start: +|| +end +start: +|| +end +start: +|| +end +start: +|| +|| +end + +Unquoted "": +start: +|| +end +start: +|| +end +start: +|| +end +start: +|| +end +start: +|| +|| +end + +Quoted '': +start: +|''| +end +start: +|'' | +end +start: +| ''| +end +start: +| '' | +end +start: +|'' ''| +end + +Quoted "": +start: +|| +end +start: +| | +end +start: +| | +end +start: +| | +end +start: +| | +end diff --git a/shell/hush_test/hush-quoting/dollar_altvalue2.tests b/shell/hush_test/hush-quoting/dollar_altvalue2.tests new file mode 100755 index 000000000..3377eb27f --- /dev/null +++ b/shell/hush_test/hush-quoting/dollar_altvalue2.tests @@ -0,0 +1,33 @@ +f() { echo start:; for i; do echo "|$i|"; done; echo end; } +x=a + +echo "Unquoted '':" +f ${x:+''} +f ${x:+'' } +f ${x:+ ''} +f ${x:+ '' } +f ${x:+'' ''} + +echo +echo 'Unquoted "":' +f ${x:+""} +f ${x:+"" } +f ${x:+ ""} +f ${x:+ "" } +f ${x:+"" ""} + +echo +echo "Quoted '':" +f "${x:+''}" +f "${x:+'' }" +f "${x:+ ''}" +f "${x:+ '' }" +f "${x:+'' ''}" + +echo +echo 'Quoted "":' +f "${x:+""}" +f "${x:+"" }" +f "${x:+ ""}" +f "${x:+ "" }" +f "${x:+"" ""}" diff --git a/shell/hush_test/hush-quoting/dollar_altvalue9.right b/shell/hush_test/hush-quoting/dollar_altvalue9.right index fc6c2697c..39342fe7c 100644 --- a/shell/hush_test/hush-quoting/dollar_altvalue9.right +++ b/shell/hush_test/hush-quoting/dollar_altvalue9.right @@ -3,6 +3,7 @@ Unquoted 1: |x y| |1| |2| +|| |1 2| |A| |B| @@ -14,6 +15,7 @@ Unquoted 2: |ax y| |1| |2| +|| |1 2| |A| |B| |