2022年3月15日(火) 4:06 Chet Ramey :
> > Description:
> >
> >The escaping of the invisible characters in the directory names in
> >the prompt escapes \w, \W and the path in \s has been implemented in
> >the function `sh_backslash_quote_for_double_quotes'
> >(lib/sh/shquote.c:323) in commit b4e5e550. The primary purpose of
> >the function `sh_backslash_quote_for_double_quotes' is to quote
> >special characters in double quotes with a backslash. When the
> >escaping of the invisible characters are turned on by the argument
> >FLAG, a backslash in the visible representation of $'\034', '^\', it
> >not properly escaped by another backslash. This may break the
> >escaping of the succeeding special character.
>
> I did it this way precisely to avoid two passes through the string. If
> that's not an issue, you can just call sh_strvis and then
> sh_backslash_quote_for_double_quotes on the result.
Thank you for the suggestion. You are right. I have updated patch A
[see attached 0001-fix-prompt-charvis-A.v2.patch]. Or maybe another
option might be to just drop the argument FLAGS from
`sh_backslash_quote_for_double_quotes' and call `sh_strvis' at the
caller side [see another patch C attached as
0001-fix-prompt-charvis-C.patch].
--
Koichi
From 78e6234fb3bf0d1112f26735a0a594a32190b96e Mon Sep 17 00:00:00 2001
From: Koichi Murase
Date: Sat, 12 Mar 2022 15:52:57 +0900
Subject: [PATCH 1/4] fix backslash quoting of invisible character ^\
---
lib/sh/shquote.c | 24
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/lib/sh/shquote.c b/lib/sh/shquote.c
index 622fcbb0..63d891dc 100644
--- a/lib/sh/shquote.c
+++ b/lib/sh/shquote.c
@@ -39,7 +39,7 @@
extern char *ansic_quote PARAMS((char *, int, int *));
extern int ansic_shouldquote PARAMS((const char *));
-extern int sh_charvis PARAMS((const char *, size_t *, size_t, char *, size_t *));
+extern char *sh_strvis PARAMS((const char *));
/* Default set of characters that should be backslash-quoted in strings */
static const char bstab[256] =
@@ -316,7 +316,7 @@ sh_backslash_quote (string, table, flags)
#if defined (PROMPT_STRING_DECODE) || defined (TRANSLATABLE_STRINGS)
/* Quote characters that get special treatment when in double quotes in STRING
using backslashes. If FLAGS == 1, also make `unsafe' characters visible by
- translating them to a standard ^X/M-X representation by calling sh_charvis,
+ translating them to a standard ^X/M-X representation by calling sh_strvis,
which handles multibyte characters as well.
Return a new string. */
char *
@@ -329,12 +329,15 @@ sh_backslash_quote_for_double_quotes (string, flags)
size_t slen, sind, rind;
int mb_cur_max;
DECLARE_MBSTATE;
-
+
+ if (flags & 1)
+string = sh_strvis (string);
+
slen = strlen (string);
send = string + slen;
mb_cur_max = MB_CUR_MAX;
- /* Max is 4*string length (backslash + three-character visible representation) */
- result = (char *)xmalloc (4 * slen + 1);
+ /* Max is 2*string length (backslash) */
+ result = (char *)xmalloc (2 * slen + 1);
for (rind = sind = 0; c = string[sind]; sind++)
{
@@ -343,13 +346,6 @@ sh_backslash_quote_for_double_quotes (string, flags)
if ((sh_syntaxtab[c] & CBSDQUOTE) && c != '\n')
result[rind++] = '\\';
- if (flags & 1)
- {
- sh_charvis (string, &sind, slen, result, &rind);
- sind--; /* sh_charvis consumes an extra character */
- continue;
- }
-
/* I should probably use the CSPECL flag for these in sh_syntaxtab[] */
else if (c == CTLESC || c == CTLNUL)
result[rind++] = CTLESC; /* could be '\\'? */
@@ -368,6 +364,10 @@ sh_backslash_quote_for_double_quotes (string, flags)
}
result[rind] = '\0';
+
+ if (flags & 1)
+free(string);
+
return (result);
}
#endif /* PROMPT_STRING_DECODE */
--
2.35.1
0001-fix-prompt-charvis-C.patch
Description: Binary data