summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko2010-09-09 14:04:57 +0200
committerDenys Vlasenko2010-09-09 14:04:57 +0200
commit101a4e3e2170e5ffa2bd2b06d7a71088a0ab8958 (patch)
tree308531a1fe9fcd7e6a5503e97a99465c9b8d5b1c
parent5b6210cf492dba4474d83a138c95b1267777826b (diff)
downloadbusybox-101a4e3e2170e5ffa2bd2b06d7a71088a0ab8958.zip
busybox-101a4e3e2170e5ffa2bd2b06d7a71088a0ab8958.tar.gz
hush: make parse_dollar flag quited status regardless of glob escaping status
function old new delta parse_stream_dquoted 228 233 +5 parse_stream 2369 2371 +2 parse_dollar 730 717 -13 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 2/1 up/down: 7/-13) Total: -6 bytes Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
-rw-r--r--shell/hush.c17
-rw-r--r--shell/hush_test/hush-vars/var_unbackslash.right20
-rwxr-xr-xshell/hush_test/hush-vars/var_unbackslash.tests6
3 files changed, 22 insertions, 21 deletions
diff --git a/shell/hush.c b/shell/hush.c
index b19d4ea..d58f526 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -3525,16 +3525,15 @@ static int add_till_closing_bracket(o_string *dest, struct in_str *input, unsign
/* Return code: 0 for OK, 1 for syntax error */
#if BB_MMU
-#define parse_dollar(as_string, dest, input) \
- parse_dollar(dest, input)
+#define parse_dollar(as_string, dest, input, quote_mask) \
+ parse_dollar(dest, input, quote_mask)
#define as_string NULL
#endif
static int parse_dollar(o_string *as_string,
o_string *dest,
- struct in_str *input)
+ struct in_str *input, unsigned char quote_mask)
{
int ch = i_peek(input); /* first character after the $ */
- unsigned char quote_mask = (dest->o_expflags & EXP_FLAG_ESC_GLOB_CHARS) ? 0x80 : 0;
debug_printf_parse("parse_dollar entered: ch='%c'\n", ch);
if (isalpha(ch)) {
@@ -3576,17 +3575,19 @@ static int parse_dollar(o_string *as_string,
nommu_addchr(as_string, ch);
ch = i_getch(input); /* first char after '{' */
- nommu_addchr(as_string, ch);
/* It should be ${?}, or ${#var},
* or even ${?+subst} - operator acting on a special variable,
* or the beginning of variable name.
*/
- if (!strchr(_SPECIAL_VARS_STR, ch) && !isalnum(ch)) { /* not one of those */
+ if (ch == EOF
+ || (!strchr(_SPECIAL_VARS_STR, ch) && !isalnum(ch)) /* not one of those */
+ ) {
bad_dollar_syntax:
syntax_error_unterm_str("${name}");
debug_printf_parse("parse_dollar return 1: unterminated ${name}\n");
return 1;
}
+ nommu_addchr(as_string, ch);
ch |= quote_mask;
/* It's possible to just call add_till_closing_bracket() at this point.
@@ -3785,7 +3786,7 @@ static int parse_stream_dquoted(o_string *as_string,
goto again;
}
if (ch == '$') {
- if (parse_dollar(as_string, dest, input) != 0) {
+ if (parse_dollar(as_string, dest, input, /*quote_mask:*/ 0x80) != 0) {
debug_printf_parse("parse_stream_dquoted return 1: "
"parse_dollar returned non-0\n");
return 1;
@@ -4135,7 +4136,7 @@ static struct pipe *parse_stream(char **pstring,
#endif
break;
case '$':
- if (parse_dollar(&ctx.as_string, &dest, input) != 0) {
+ if (parse_dollar(&ctx.as_string, &dest, input, /*quote_mask:*/ 0) != 0) {
debug_printf_parse("parse_stream parse error: "
"parse_dollar returned non-0\n");
goto parse_error;
diff --git a/shell/hush_test/hush-vars/var_unbackslash.right b/shell/hush_test/hush-vars/var_unbackslash.right
index 20c2ddf..8bc8347 100644
--- a/shell/hush_test/hush-vars/var_unbackslash.right
+++ b/shell/hush_test/hush-vars/var_unbackslash.right
@@ -1,11 +1,11 @@
-b1=-qwerty-t-\-"---z-*-?-
-b1=-qwerty-t-\-"---z-*-?-
-b2=-qwerty-\t-\-"-\--\z-\*-\?-
-b2=-qwerty-\t-\-"-\--\z-\*-\?-
-b3=-$a-\t-\\-\"-\--\z-\*-\?-
-b3=-$a-\t-\\-\"-\--\z-\*-\?-
-c=-$a-\t-\\-\"-\--\z-\*-\?-
-c=-$a-\t-\\-\"-\--\z-\*-\?-
-c=-$a-\t-\\-\"-\--\z-\*-\?-
-c=-$a-\t-\\-\"-\--\z-\*-\?-
+b1=-qwerty-t-\-"-`---z-*-?-
+b1=-qwerty-t-\-"-`---z-*-?-
+b2=-qwerty-\t-\-"-`-\--\z-\*-\?-
+b2=-qwerty-\t-\-"-`-\--\z-\*-\?-
+b3=-$a-\t-\\-\"-\`-\--\z-\*-\?-
+b3=-$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
index 3c35d7d..bb52af3 100755
--- a/shell/hush_test/hush-vars/var_unbackslash.tests
+++ b/shell/hush_test/hush-vars/var_unbackslash.tests
@@ -1,13 +1,13 @@
# Test for correct handling of backslashes
a=qwerty
-b=-$a-\t-\\-\"-\--\z-\*-\?-
+b=-$a-\t-\\-\"-\`-\--\z-\*-\?-
echo b1=$b
echo "b1=$b"
-b="-$a-\t-\\-\"-\--\z-\*-\?-"
+b="-$a-\t-\\-\"-\`-\--\z-\*-\?-"
echo b2=$b
echo "b2=$b"
-b='-$a-\t-\\-\"-\--\z-\*-\?-'
+b='-$a-\t-\\-\"-\`-\--\z-\*-\?-'
echo b3=$b
echo "b3=$b"