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 <s.hauer@xxxxxxxxxxxxxx> --- common/hush.c | 9 +++++++++ 1 file changed, 9 insertions(+) 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; -- 2.30.2