[git commit master 1/1] ash: fix dequoting error detected by var_bash4 test

Denys Vlasenko vda.linux at googlemail.com
Fri Aug 6 17:14:47 UTC 2010


commit: http://git.busybox.net/busybox/commit/?id=f02c82f38c749f20a917aeb7ff4d929c5292a63d
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

But the test still fails (one more bug to fix)

function                                             old     new   delta
changepath                                           195     192      -3
readtoken1                                          3247    3240      -7
subevalvar                                          1204    1184     -20
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/3 up/down: 0/-30)             Total: -30 bytes

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 shell/ash.c |   13 ++++++-------
 1 files changed, 6 insertions(+), 7 deletions(-)

diff --git a/shell/ash.c b/shell/ash.c
index 16783f2..74b1c3a 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -6267,7 +6267,7 @@ varunset(const char *end, const char *var, const char *umsg, int varflags)
 
 #if ENABLE_ASH_BASH_COMPAT
 static char *
-parse_sub_pattern(char *arg, int inquotes)
+parse_sub_pattern(char *arg, int varflags)
 {
 	char *idx, *repl = NULL;
 	unsigned char c;
@@ -6285,7 +6285,7 @@ parse_sub_pattern(char *arg, int inquotes)
 			}
 		}
 		*idx++ = c;
-		if (!inquotes && c == '\\' && arg[1] == '\\')
+		if (!(varflags & VSQUOTE) && c == '\\' && arg[1] == '\\')
 			arg++; /* skip both \\, not just first one */
 		arg++;
 	}
@@ -6427,7 +6427,7 @@ subevalvar(char *p, char *varname, int strloc, int subtype,
 		char *idx, *end;
 
 		if (!repl) {
-			repl = parse_sub_pattern(str, varflags & VSQUOTE);
+			repl = parse_sub_pattern(str, varflags);
 			//bb_error_msg("repl:'%s'", repl);
 			if (!repl)
 				repl = nullstr;
@@ -6496,12 +6496,11 @@ subevalvar(char *p, char *varname, int strloc, int subtype,
 			}
 
 			if (subtype == VSREPLACE) {
+				//bb_error_msg("tail:'%s', quotes:%x", idx, quotes);
 				while (*idx) {
 					char *restart_detect = stackblock();
-					if (quotes && *idx == '\\') {
-						STPUTC(CTLESC, expdest);
-						len++;
-					}
+					if (quotes && (unsigned char)*idx == CTLESC)
+						idx++;
 					STPUTC(*idx, expdest);
 					if (stackblock() != restart_detect)
 						goto restart;
-- 
1.7.1



More information about the busybox-cvs mailing list