From 25c37d4804a9dbe0824ba805cc2b7cb94d243682 Mon Sep 17 00:00:00 2001 From: Chet Ramey Date: Wed, 23 Jul 2025 15:52:32 -0400 Subject: [PATCH] Bash-5.3 patch 3: remove internal quoting that causes failures when expanding nested array subscripts in an arithmetic context --- patchlevel.h | 2 +- subst.c | 14 +++++++++++--- tests/quotearray.right | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/patchlevel.h b/patchlevel.h index ceabc701..a1609dc8 100644 --- a/patchlevel.h +++ b/patchlevel.h @@ -25,6 +25,6 @@ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh looks for to find the patch level (for the sccs version string). */ -#define PATCHLEVEL 2 +#define PATCHLEVEL 3 #endif /* _PATCHLEVEL_H_ */ diff --git a/subst.c b/subst.c index e9d3e755..a8ae174d 100644 --- a/subst.c +++ b/subst.c @@ -3795,9 +3795,9 @@ pos_params (const char *string, int start, int end, int quoted, int pflags) #define EXP_CHAR(s) (s == '$' || s == '`' || s == CTLESC || s == '~') #endif -/* We don't perform process substitution in arithmetic expressions, so don't - bother checking for it. */ -#define ARITH_EXP_CHAR(s) (s == '$' || s == '`' || s == CTLESC || s == '~') +/* We don't perform process substitution or tilde expansion in arithmetic + expressions, so don't bother checking for them. */ +#define ARITH_EXP_CHAR(s) (s == '$' || s == '`' || s == CTLESC) /* If there are any characters in STRING that require full expansion, then call FUNC to expand STRING; otherwise just perform quote @@ -12215,6 +12215,14 @@ string_quote_removal (const char *string, int quoted) *r++ = '\\'; break; } +#if defined (ARRAY_VARS) + /* The only special characters that matter here are []~, since those + are backslash-quoted in expand_array_subscript but not dequoted + by the statement following this one. */ + if ((quoted & Q_ARITH) && (c == LBRACK || c == RBRACK || c == '~')) + ; /* placeholder here */ + else +#endif if (((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || dquote) && (sh_syntaxtab[c] & CBSDQUOTE) == 0) *r++ = '\\'; /* FALLTHROUGH */ diff --git a/tests/quotearray.right b/tests/quotearray.right index a3cc93a6..a75ef52a 100644 --- a/tests/quotearray.right +++ b/tests/quotearray.right @@ -44,7 +44,7 @@ declare -A assoc=(["\` echo >&2 foo\`"]="128" [0]="0" ["]"]="12" ["x],b[\$(echo foo 0 0 -./quotearray1.sub: line 68: 0\],b\[1: arithmetic syntax error: invalid arithmetic operator (error token is "\],b\[1") +./quotearray1.sub: line 68: 0],b[1: arithmetic syntax error: invalid arithmetic operator (error token is "],b[1") declare -a array 0 0 -- 2.47.3