[git commit] hush: fix handling of $_ (so far it's an ordinary variable, no special meaning)

Denys Vlasenko vda.linux at googlemail.com
Thu Jan 25 12:20:50 UTC 2018


commit: https://git.busybox.net/busybox/commit/?id=0ca3198f9333b363ced46bfabf51c0d6b111c875
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

function                                             old     new   delta
parse_dollar                                         820     779     -41

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 shell/hush.c | 27 +++++++++++++++++----------
 1 file changed, 17 insertions(+), 10 deletions(-)

diff --git a/shell/hush.c b/shell/hush.c
index 7b83c73..a9183c8 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -4520,9 +4520,10 @@ static int parse_dollar(o_string *as_string,
 
 	debug_printf_parse("parse_dollar entered: ch='%c'\n", ch);
 	if (isalpha(ch)) {
+ make_var:
 		ch = i_getch(input);
 		nommu_addchr(as_string, ch);
- make_var:
+ /*make_var1:*/
 		o_addchr(dest, SPECIAL_VAR_SYMBOL);
 		while (1) {
 			debug_printf_parse(": '%c'\n", ch);
@@ -4715,19 +4716,22 @@ static int parse_dollar(o_string *as_string,
 	}
 #endif
 	case '_':
+		goto make_var;
+#if 0
+	/* TODO: $_ and $-: */
+	/* $_ Shell or shell script name; or last argument of last command
+	 * (if last command wasn't a pipe; if it was, bash sets $_ to "");
+	 * but in command's env, set to full pathname used to invoke it */
+	/* $- Option flags set by set builtin or shell options (-i etc) */
 		ch = i_getch(input);
 		nommu_addchr(as_string, ch);
 		ch = i_peek_and_eat_bkslash_nl(input);
 		if (isalnum(ch)) { /* it's $_name or $_123 */
 			ch = '_';
-			goto make_var;
+			goto make_var1;
 		}
 		/* else: it's $_ */
-	/* TODO: $_ and $-: */
-	/* $_ Shell or shell script name; or last argument of last command
-	 * (if last command wasn't a pipe; if it was, bash sets $_ to "");
-	 * but in command's env, set to full pathname used to invoke it */
-	/* $- Option flags set by set builtin or shell options (-i etc) */
+#endif
 	default:
 		o_addQchr(dest, '$');
 	}
@@ -5669,9 +5673,9 @@ static char *replace_pattern(char *val, const char *pattern, const char *repl, c
  */
 static NOINLINE const char *expand_one_var(char **to_be_freed_pp, char *arg, char **pp)
 {
-	const char *val = NULL;
-	char *to_be_freed = NULL;
-	char *p = *pp;
+	const char *val;
+	char *to_be_freed;
+	char *p;
 	char *var;
 	char first_char;
 	char exp_op;
@@ -5680,6 +5684,9 @@ static NOINLINE const char *expand_one_var(char **to_be_freed_pp, char *arg, cha
 	char *exp_word = exp_word; /* for compiler */
 	char arg0;
 
+	val = NULL;
+	to_be_freed = NULL;
+	p = *pp;
 	*p = '\0'; /* replace trailing SPECIAL_VAR_SYMBOL */
 	var = arg;
 	exp_saveptr = arg[1] ? strchr(VAR_ENCODED_SUBST_OPS, arg[1]) : NULL;


More information about the busybox-cvs mailing list