From 70e0885229d250c2c4dede0a9513c76c10ad44bd Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Thu, 27 Oct 2022 10:38:25 +0200 Subject: hush: Fix handling '\ ' Currently when doing: echo foo\ bar we will get argv[1] = "foo\" and argv[2] = "bar". An unquoted escaped whitespace should be replaced by a whitespace. With this the above will correctly result in argv[1] = "foo bar" Signed-off-by: Sascha Hauer --- common/hush.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'common') diff --git a/common/hush.c b/common/hush.c index 6a089fabf1..5138a1a45a 100644 --- a/common/hush.c +++ b/common/hush.c @@ -617,6 +617,7 @@ static int builtin_exit(struct p_context *ctx, struct child_prog *child, static void remove_quotes_in_str(char *src) { char *trg = src; + bool in_double_quotes = false; while (*src) { if (*src == '\'') { @@ -629,6 +630,7 @@ static void remove_quotes_in_str(char *src) /* drop quotes */ if (*src == '"') { + in_double_quotes = !in_double_quotes; src++; continue; } @@ -654,6 +656,13 @@ static void remove_quotes_in_str(char *src) continue; } + /* replace '\ ' with ' ' */ + if (!in_double_quotes && *src == '\\' && *(src + 1) == ' ') { + *trg++ = ' '; + src += 2; + continue; + } + *trg++ = *src++; } *trg = 0; -- cgit v1.2.3