[PATCH] builtin: Keep backslash on quotes outside of dollarsq

Herbert Xu <[email protected]> Mon, 6 Oct 2025 11:26:02 +0800
Newsgroups org.kernel.vger.dash
Message-ID <[email protected]>
Juergen Daubert <[email protected]> wrote:
> I'm using dash 0.5.13 with the two patches 
> 
>  [PATCH] expand: Fix off-by-one bug in expmeta
>  [PATCH] expand: Fix typo in pmatch for wildcard search
> 
> as /bin/sh and get the folling breaking while building 
> GNU inetutils:
> 
> ...
> make[2]: Entering directory '/tmp/inetutils/src/inetutils-2.6/src'
>  CC       hostname.o
>  CC       traceroute.o
>  CC       inetd.o
> <command-line>: error: expected expression before '/' token
> inetd.c:166:31: note: in expansion of macro 'PATH_INETDPID'
>  166 | static const char *pid_file = PATH_INETDPID;
>      |                               ^~~~~~~~~~~~~

Thanks for the report! This is due to an unintended change in behaviour
of echo '\"'.  Thie patch should fix the problem.

---8<---
Only dollar single quote should eat the backslash character before
a quote.  Make the skipping of the backslash conditional on mbchar
in conv_escape.

Reported-by: Juergen Daubert <[email protected]>
Fixes: 776424a8f915 ("parser: Add dollar single quote")
Signed-off-by: Herbert Xu <[email protected]>

diff --git a/src/bltin/printf.c b/src/bltin/printf.c
index ff576ff..106aecd 100644
--- a/src/bltin/printf.c
+++ b/src/bltin/printf.c
@@ -339,7 +339,7 @@ unsigned conv_escape(char *str0, char *out0, bool mbchar)
 
 	switch (ch) {
 	default:
-		if (ch == '"' || ch == '\'')
+		if (mbchar && (ch == '"' || ch == '\''))
 			break;
 
 		if (ch == 'U') {
-- 
Email: Herbert Xu <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt