aboutsummaryrefslogtreecommitdiff
path: root/shell/hush.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2018-01-25 13:20:50 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2018-01-25 13:20:50 +0100
commit0ca3198f9333b363ced46bfabf51c0d6b111c875 (patch)
tree8b6d3b18ad914f25f741784ff82986014f58c60a /shell/hush.c
parenta497231f537352c7ff7a80c07ef6191b00e7e30e (diff)
downloadbusybox-w32-0ca3198f9333b363ced46bfabf51c0d6b111c875.tar.gz
busybox-w32-0ca3198f9333b363ced46bfabf51c0d6b111c875.tar.bz2
busybox-w32-0ca3198f9333b363ced46bfabf51c0d6b111c875.zip
hush: fix handling of $_ (so far it's an ordinary variable, no special meaning)
function old new delta parse_dollar 820 779 -41 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell/hush.c')
-rw-r--r--shell/hush.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/shell/hush.c b/shell/hush.c
index 7b83c736c..a9183c82f 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -4520,9 +4520,10 @@ static int parse_dollar(o_string *as_string,
4520 4520
4521 debug_printf_parse("parse_dollar entered: ch='%c'\n", ch); 4521 debug_printf_parse("parse_dollar entered: ch='%c'\n", ch);
4522 if (isalpha(ch)) { 4522 if (isalpha(ch)) {
4523 make_var:
4523 ch = i_getch(input); 4524 ch = i_getch(input);
4524 nommu_addchr(as_string, ch); 4525 nommu_addchr(as_string, ch);
4525 make_var: 4526 /*make_var1:*/
4526 o_addchr(dest, SPECIAL_VAR_SYMBOL); 4527 o_addchr(dest, SPECIAL_VAR_SYMBOL);
4527 while (1) { 4528 while (1) {
4528 debug_printf_parse(": '%c'\n", ch); 4529 debug_printf_parse(": '%c'\n", ch);
@@ -4715,19 +4716,22 @@ static int parse_dollar(o_string *as_string,
4715 } 4716 }
4716#endif 4717#endif
4717 case '_': 4718 case '_':
4719 goto make_var;
4720#if 0
4721 /* TODO: $_ and $-: */
4722 /* $_ Shell or shell script name; or last argument of last command
4723 * (if last command wasn't a pipe; if it was, bash sets $_ to "");
4724 * but in command's env, set to full pathname used to invoke it */
4725 /* $- Option flags set by set builtin or shell options (-i etc) */
4718 ch = i_getch(input); 4726 ch = i_getch(input);
4719 nommu_addchr(as_string, ch); 4727 nommu_addchr(as_string, ch);
4720 ch = i_peek_and_eat_bkslash_nl(input); 4728 ch = i_peek_and_eat_bkslash_nl(input);
4721 if (isalnum(ch)) { /* it's $_name or $_123 */ 4729 if (isalnum(ch)) { /* it's $_name or $_123 */
4722 ch = '_'; 4730 ch = '_';
4723 goto make_var; 4731 goto make_var1;
4724 } 4732 }
4725 /* else: it's $_ */ 4733 /* else: it's $_ */
4726 /* TODO: $_ and $-: */ 4734#endif
4727 /* $_ Shell or shell script name; or last argument of last command
4728 * (if last command wasn't a pipe; if it was, bash sets $_ to "");
4729 * but in command's env, set to full pathname used to invoke it */
4730 /* $- Option flags set by set builtin or shell options (-i etc) */
4731 default: 4735 default:
4732 o_addQchr(dest, '$'); 4736 o_addQchr(dest, '$');
4733 } 4737 }
@@ -5669,9 +5673,9 @@ static char *replace_pattern(char *val, const char *pattern, const char *repl, c
5669 */ 5673 */
5670static NOINLINE const char *expand_one_var(char **to_be_freed_pp, char *arg, char **pp) 5674static NOINLINE const char *expand_one_var(char **to_be_freed_pp, char *arg, char **pp)
5671{ 5675{
5672 const char *val = NULL; 5676 const char *val;
5673 char *to_be_freed = NULL; 5677 char *to_be_freed;
5674 char *p = *pp; 5678 char *p;
5675 char *var; 5679 char *var;
5676 char first_char; 5680 char first_char;
5677 char exp_op; 5681 char exp_op;
@@ -5680,6 +5684,9 @@ static NOINLINE const char *expand_one_var(char **to_be_freed_pp, char *arg, cha
5680 char *exp_word = exp_word; /* for compiler */ 5684 char *exp_word = exp_word; /* for compiler */
5681 char arg0; 5685 char arg0;
5682 5686
5687 val = NULL;
5688 to_be_freed = NULL;
5689 p = *pp;
5683 *p = '\0'; /* replace trailing SPECIAL_VAR_SYMBOL */ 5690 *p = '\0'; /* replace trailing SPECIAL_VAR_SYMBOL */
5684 var = arg; 5691 var = arg;
5685 exp_saveptr = arg[1] ? strchr(VAR_ENCODED_SUBST_OPS, arg[1]) : NULL; 5692 exp_saveptr = arg[1] ? strchr(VAR_ENCODED_SUBST_OPS, arg[1]) : NULL;