bash: Update to version 5.2 plus patches 1 to 9

Message ID 20221119144005.382898-1-adolf.belka@ipfire.org
State Accepted
Commit 5be71d2a6efbbf1cf48aca6272d28fbf00ce8f12
Headers
Series bash: Update to version 5.2 plus patches 1 to 9 |

Commit Message

Adolf Belka Nov. 19, 2022, 2:40 p.m. UTC
  - Update from version 5.1.16 to version 5.2 plus patches 1 to 9
- Update of rootfile
- Changelog
    This is a terse description of the new features added to bash-5.2 since
     the release of bash-5.1.  As always, the manual page (doc/bash.1) is
     the place to look for complete descriptions.
    1. New Features in Bash
	a. The bash malloc returns memory that is aligned on 16-byte boundaries.
	b. There is a new internal timer framework used for read builtin timeouts.
	c. Rewrote the command substitution parsing code to call the parser recursively
	   and rebuild the command string from the parsed command. This allows better
	   syntax checking and catches errors much earlier. Along with this, if
	   command substitution parsing completes with here-documents remaining to be
	   read, the shell prints a warning message and reads the here-document bodies
	   from the current input stream.
	d. The `ulimit' builtin now treats an operand remaining after all of the options
	   and arguments are parsed as an argument to the last command specified by
	   an option. This is for POSIX compatibility.
	e. Here-document parsing now handles $'...' and $"..." quoting when reading the
	   here-document body.
	f. The `shell-expand-line' and `history-and-alias-expand-line' bindable readline
	   commands now understand $'...' and $"..." quoting.
	g. There is a new `spell-correct-word' bindable readline command to perform
	   spelling correction on the current word.
	h. The `unset' builtin now attempts to treat arguments as array subscripts
	   without parsing or expanding the subscript, even when `assoc_expand_once'
	   is not set.
	i. There is a default value for $BASH_LOADABLES_PATH in config-top.h.
	j. Associative array assignment and certain instances of referencing (e.g.,
	   `test -v' now allow `@' and `*' to be used as keys.
	k. Bash attempts to expand indexed array subscripts only once when executing
	   shell constructs and word expansions.
	l. The `unset' builtin allows a subscript of `@' or `*' to unset a key with
	   that value for associative arrays instead of unsetting the entire array
	   (which you can still do with `unset arrayname'). For indexed arrays, it
	   removes all elements of the array without unsetting it (like `A=()').
	m. Additional builtins (printf/test/read/wait) do a better job of not
	   parsing array subscripts if array_expand_once is set.
	n. New READLINE_ARGUMENT variable set to numeric argument for readline commands
	   defined using `bind -x'.
	o. The new `varredir_close' shell option causes bash to automatically close
	   file descriptors opened with {var}<fn and other styles of varassign
	   redirection unless they're arguments to the `exec' builtin.
	p. The `$0' special parameter is now set to the name of the script when running
	   any (non-interactive) startup files such as $BASH_ENV.
	q. The `enable' builtin tries to load a loadable builtin using the default
	   search path if `enable name' (without any options) attempts to enable a
	   non-existent builtin.
	r. The `printf' builtin has a new format specifier: %Q. This acts like %q but
	   applies any specified precision to the original unquoted argument, then
	   quotes and outputs the result.
	s. The new `noexpand_translations' option controls whether or not the translated
	   output of $"..." is single-quoted.
	t. There is a new parameter transformation operator: @k. This is like @K, but
	   expands the result to separate words after word splitting.
	u. There is an alternate array implementation, selectable at `configure' time,
	   that optimizes access speed over memory use (use the new configure
	    --enable-alt-array-implementation option).
	v. If an [N]<&WORD- or [N]>&WORD- redirection has WORD expand to the empty
	   string, treat the redirection as [N]<&- or [N]>&- and close file descriptor
	   N (default 0).
	w. Invalid parameter transformation operators are now invalid word expansions,
	   and so cause fatal errors in non-interactive shells.
	x. New shell option: patsub_replacement. When enabled, a `&' in the replacement
	   string of the pattern substitution expansion is replaced by the portion of
	   the string that matched the pattern. Backslash will escape the `&' and
	   insert a literal `&'.
	y. `command -p' no longer looks in the hash table for the specified command.
	z. The new `--enable-translatable-strings' option to `configure' allows $"..."
	   support to be compiled in or out.
	aa. The new `globskipdots' shell option forces pathname expansion never to
	    return `.' or `..' unless explicitly matched. It is enabled by default.
	bb. Array references using `@' and `*' that are the value of nameref variables
	    (declare -n ref='v[@]' ; echo $ref) no longer cause the shell to exit if
	    set -u is enabled and the array (v) is unset.
	cc. There is a new bindable readline command name:
	    `vi-edit-and-execute-command'.
	dd. In posix mode, the `printf' builtin checks for the `L' length modifier and
	    uses long double for floating point conversion specifiers if it's present,
	    double otherwise.
	ee. The `globbing' completion code now takes the `globstar' option into account.
	ff. `suspend -f' now forces the shell to suspend even if job control is not
	   currently enabled.
	gg. Since there is no `declare -' equivalent of `local -', make sure to use
	    `local -' in the output of `local -p'.

Signed-off-by: Adolf Belka <adolf.belka@ipfire.org>
---
 config/rootfiles/common/bash |   5 +
 lfs/bash                     |   9 +-
 src/patches/bash/bash52-001  |  46 ++++++
 src/patches/bash/bash52-002  |  46 ++++++
 src/patches/bash/bash52-003  |  89 +++++++++++
 src/patches/bash/bash52-004  |  70 +++++++++
 src/patches/bash/bash52-005  |  47 ++++++
 src/patches/bash/bash52-006  | 293 +++++++++++++++++++++++++++++++++++
 src/patches/bash/bash52-007  | 262 +++++++++++++++++++++++++++++++
 src/patches/bash/bash52-008  |  58 +++++++
 src/patches/bash/bash52-009  |  43 +++++
 11 files changed, 966 insertions(+), 2 deletions(-)
 create mode 100644 src/patches/bash/bash52-001
 create mode 100644 src/patches/bash/bash52-002
 create mode 100644 src/patches/bash/bash52-003
 create mode 100644 src/patches/bash/bash52-004
 create mode 100644 src/patches/bash/bash52-005
 create mode 100644 src/patches/bash/bash52-006
 create mode 100644 src/patches/bash/bash52-007
 create mode 100644 src/patches/bash/bash52-008
 create mode 100644 src/patches/bash/bash52-009
  

Comments

Michael Tremer Nov. 21, 2022, 9:49 a.m. UTC | #1
Reviewed-by: Michael Tremer <michael.tremer@ipfire.org>

> On 19 Nov 2022, at 14:40, Adolf Belka <adolf.belka@ipfire.org> wrote:
> 
> - Update from version 5.1.16 to version 5.2 plus patches 1 to 9
> - Update of rootfile
> - Changelog
>    This is a terse description of the new features added to bash-5.2 since
>     the release of bash-5.1.  As always, the manual page (doc/bash.1) is
>     the place to look for complete descriptions.
>    1. New Features in Bash
> a. The bash malloc returns memory that is aligned on 16-byte boundaries.
> b. There is a new internal timer framework used for read builtin timeouts.
> c. Rewrote the command substitution parsing code to call the parser recursively
>   and rebuild the command string from the parsed command. This allows better
>   syntax checking and catches errors much earlier. Along with this, if
>   command substitution parsing completes with here-documents remaining to be
>   read, the shell prints a warning message and reads the here-document bodies
>   from the current input stream.
> d. The `ulimit' builtin now treats an operand remaining after all of the options
>   and arguments are parsed as an argument to the last command specified by
>   an option. This is for POSIX compatibility.
> e. Here-document parsing now handles $'...' and $"..." quoting when reading the
>   here-document body.
> f. The `shell-expand-line' and `history-and-alias-expand-line' bindable readline
>   commands now understand $'...' and $"..." quoting.
> g. There is a new `spell-correct-word' bindable readline command to perform
>   spelling correction on the current word.
> h. The `unset' builtin now attempts to treat arguments as array subscripts
>   without parsing or expanding the subscript, even when `assoc_expand_once'
>   is not set.
> i. There is a default value for $BASH_LOADABLES_PATH in config-top.h.
> j. Associative array assignment and certain instances of referencing (e.g.,
>   `test -v' now allow `@' and `*' to be used as keys.
> k. Bash attempts to expand indexed array subscripts only once when executing
>   shell constructs and word expansions.
> l. The `unset' builtin allows a subscript of `@' or `*' to unset a key with
>   that value for associative arrays instead of unsetting the entire array
>   (which you can still do with `unset arrayname'). For indexed arrays, it
>   removes all elements of the array without unsetting it (like `A=()').
> m. Additional builtins (printf/test/read/wait) do a better job of not
>   parsing array subscripts if array_expand_once is set.
> n. New READLINE_ARGUMENT variable set to numeric argument for readline commands
>   defined using `bind -x'.
> o. The new `varredir_close' shell option causes bash to automatically close
>   file descriptors opened with {var}<fn and other styles of varassign
>   redirection unless they're arguments to the `exec' builtin.
> p. The `$0' special parameter is now set to the name of the script when running
>   any (non-interactive) startup files such as $BASH_ENV.
> q. The `enable' builtin tries to load a loadable builtin using the default
>   search path if `enable name' (without any options) attempts to enable a
>   non-existent builtin.
> r. The `printf' builtin has a new format specifier: %Q. This acts like %q but
>   applies any specified precision to the original unquoted argument, then
>   quotes and outputs the result.
> s. The new `noexpand_translations' option controls whether or not the translated
>   output of $"..." is single-quoted.
> t. There is a new parameter transformation operator: @k. This is like @K, but
>   expands the result to separate words after word splitting.
> u. There is an alternate array implementation, selectable at `configure' time,
>   that optimizes access speed over memory use (use the new configure
>    --enable-alt-array-implementation option).
> v. If an [N]<&WORD- or [N]>&WORD- redirection has WORD expand to the empty
>   string, treat the redirection as [N]<&- or [N]>&- and close file descriptor
>   N (default 0).
> w. Invalid parameter transformation operators are now invalid word expansions,
>   and so cause fatal errors in non-interactive shells.
> x. New shell option: patsub_replacement. When enabled, a `&' in the replacement
>   string of the pattern substitution expansion is replaced by the portion of
>   the string that matched the pattern. Backslash will escape the `&' and
>   insert a literal `&'.
> y. `command -p' no longer looks in the hash table for the specified command.
> z. The new `--enable-translatable-strings' option to `configure' allows $"..."
>   support to be compiled in or out.
> aa. The new `globskipdots' shell option forces pathname expansion never to
>    return `.' or `..' unless explicitly matched. It is enabled by default.
> bb. Array references using `@' and `*' that are the value of nameref variables
>    (declare -n ref='v[@]' ; echo $ref) no longer cause the shell to exit if
>    set -u is enabled and the array (v) is unset.
> cc. There is a new bindable readline command name:
>    `vi-edit-and-execute-command'.
> dd. In posix mode, the `printf' builtin checks for the `L' length modifier and
>    uses long double for floating point conversion specifiers if it's present,
>    double otherwise.
> ee. The `globbing' completion code now takes the `globstar' option into account.
> ff. `suspend -f' now forces the shell to suspend even if job control is not
>   currently enabled.
> gg. Since there is no `declare -' equivalent of `local -', make sure to use
>    `local -' in the output of `local -p'.
> 
> Signed-off-by: Adolf Belka <adolf.belka@ipfire.org>
> ---
> config/rootfiles/common/bash |   5 +
> lfs/bash                     |   9 +-
> src/patches/bash/bash52-001  |  46 ++++++
> src/patches/bash/bash52-002  |  46 ++++++
> src/patches/bash/bash52-003  |  89 +++++++++++
> src/patches/bash/bash52-004  |  70 +++++++++
> src/patches/bash/bash52-005  |  47 ++++++
> src/patches/bash/bash52-006  | 293 +++++++++++++++++++++++++++++++++++
> src/patches/bash/bash52-007  | 262 +++++++++++++++++++++++++++++++
> src/patches/bash/bash52-008  |  58 +++++++
> src/patches/bash/bash52-009  |  43 +++++
> 11 files changed, 966 insertions(+), 2 deletions(-)
> create mode 100644 src/patches/bash/bash52-001
> create mode 100644 src/patches/bash/bash52-002
> create mode 100644 src/patches/bash/bash52-003
> create mode 100644 src/patches/bash/bash52-004
> create mode 100644 src/patches/bash/bash52-005
> create mode 100644 src/patches/bash/bash52-006
> create mode 100644 src/patches/bash/bash52-007
> create mode 100644 src/patches/bash/bash52-008
> create mode 100644 src/patches/bash/bash52-009
> 
> diff --git a/config/rootfiles/common/bash b/config/rootfiles/common/bash
> index c28d3571a..f348b5366 100644
> --- a/config/rootfiles/common/bash
> +++ b/config/rootfiles/common/bash
> @@ -21,6 +21,7 @@
> #usr/include/bash/conftypes.h
> #usr/include/bash/dispose_cmd.h
> #usr/include/bash/error.h
> +#usr/include/bash/execute_cmd.h
> #usr/include/bash/externs.h
> #usr/include/bash/general.h
> #usr/include/bash/hashlib.h
> @@ -62,13 +63,16 @@
> #usr/include/bash/y.tab.h
> #usr/lib/bash
> usr/lib/bash/Makefile.inc
> +usr/lib/bash/Makefile.sample
> usr/lib/bash/accept
> usr/lib/bash/basename
> usr/lib/bash/csv
> usr/lib/bash/cut
> usr/lib/bash/dirname
> +usr/lib/bash/dsv
> usr/lib/bash/fdflags
> usr/lib/bash/finfo
> +usr/lib/bash/getconf
> usr/lib/bash/head
> usr/lib/bash/id
> usr/lib/bash/ln
> @@ -88,6 +92,7 @@ usr/lib/bash/rmdir
> usr/lib/bash/seq
> usr/lib/bash/setpgid
> usr/lib/bash/sleep
> +usr/lib/bash/stat
> usr/lib/bash/strftime
> usr/lib/bash/sync
> usr/lib/bash/tee
> diff --git a/lfs/bash b/lfs/bash
> index ec8939aed..14b20b986 100644
> --- a/lfs/bash
> +++ b/lfs/bash
> @@ -24,7 +24,7 @@
> 
> include Config
> 
> -VER        = 5.1.16
> +VER        = 5.2
> 
> THISAPP    = bash-$(VER)
> DL_FILE    = $(THISAPP).tar.gz
> @@ -53,7 +53,7 @@ objects = $(DL_FILE)
> 
> $(DL_FILE)             = $(DL_FROM)/$(DL_FILE)
> 
> -$(DL_FILE)_BLAKE2 = 0bc53b24d9b95cd85e45196510104acf6ac6c980f68aedcc83c8409ce6a4682e92736a9cbe089ed92d74590e28918d0bee0e67c8e0f994bd37e45fad83f5b48e
> +$(DL_FILE)_BLAKE2 = 51b196e710794ebad8eac28c31c93eb99ac1a7db30919a13271e39e1cb66a0672f242df75fc7d71627ea873dfbce53ec35c0c56a71c5167143070a7811343fd9
> 
> install : $(TARGET)
> 
> @@ -90,6 +90,11 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
> cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/bash/bash-4.0-paths-1.patch
> cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/bash/bash-4.0-profile-1.patch
> cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/bash/bash-3.2-ssh_source_bash.patch
> + 
> + for i in $$(seq 1 9); do \
> + cd $(DIR_APP) && patch -Np0 < $(DIR_SRC)/src/patches/bash/bash52-$$(printf "%03d" "$${i}") || exit 1; \
> + done
> +
> 
> cd $(DIR_APP) && ./configure --prefix=$(PREFIX) $(CONFIGURE_OPTIONS)
> cd $(DIR_APP) && make $(MAKETUNING)
> diff --git a/src/patches/bash/bash52-001 b/src/patches/bash/bash52-001
> new file mode 100644
> index 000000000..83776ec76
> --- /dev/null
> +++ b/src/patches/bash/bash52-001
> @@ -0,0 +1,46 @@
> +     BASH PATCH REPORT
> +     =================
> +
> +Bash-Release: 5.2
> +Patch-ID: bash52-001
> +
> +Bug-Reported-by: Emanuele Torre <torreemanuele6@gmail.com>
> +Bug-Reference-ID: <CAA7hNqeR1eSdiGK8mjQSqJPo815JYoG-Ekz-5PrAJTEYy2e6hg@mail.gmail.com>
> +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2022-09/msg00060.html
> +
> +Bug-Description:
> +
> +Expanding unset arrays in an arithmetic context can cause a segmentation fault.
> +
> +Patch (apply with `patch -p0'):
> +
> +*** ../bash-5.2/subst.c 2022-08-31 17:36:46.000000000 -0400
> +--- subst.c 2022-09-30 09:12:05.000000000 -0400
> +***************
> +*** 10858,10862 ****
> +    t = expand_subscript_string (exp, quoted & ~(Q_ARITH|Q_DOUBLE_QUOTES));
> +    free (exp);
> +!   exp = sh_backslash_quote (t, abstab, 0);
> +    free (t);
> +  
> +--- 10858,10862 ----
> +    t = expand_subscript_string (exp, quoted & ~(Q_ARITH|Q_DOUBLE_QUOTES));
> +    free (exp);
> +!   exp = t ? sh_backslash_quote (t, abstab, 0) : savestring ("");
> +    free (t);
> +  
> +*** ../bash-5.2/patchlevel.h 2020-06-22 14:51:03.000000000 -0400
> +--- patchlevel.h 2020-10-01 11:01:28.000000000 -0400
> +***************
> +*** 26,30 ****
> +     looks for to find the patch level (for the sccs version string). */
> +  
> +! #define PATCHLEVEL 0
> +  
> +  #endif /* _PATCHLEVEL_H_ */
> +--- 26,30 ----
> +     looks for to find the patch level (for the sccs version string). */
> +  
> +! #define PATCHLEVEL 1
> +  
> +  #endif /* _PATCHLEVEL_H_ */
> diff --git a/src/patches/bash/bash52-002 b/src/patches/bash/bash52-002
> new file mode 100644
> index 000000000..18229c996
> --- /dev/null
> +++ b/src/patches/bash/bash52-002
> @@ -0,0 +1,46 @@
> +     BASH PATCH REPORT
> +     =================
> +
> +Bash-Release: 5.2
> +Patch-ID: bash52-002
> +
> +Bug-Reported-by: Kan-Ru Chen <koster@debian.org>
> +Bug-Reference-ID:
> +Bug-Reference-URL: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1021109
> +
> +Bug-Description:
> +
> +Starting bash with an invalid locale specification for LC_ALL/LANG/LC_CTYPE
> +can cause the shell to crash.
> +
> +Patch (apply with `patch -p0'):
> +
> +*** ../bash-5.2-patched/lib/readline/nls.c 2022-08-15 09:38:51.000000000 -0400
> +--- lib/readline/nls.c 2022-10-05 09:23:22.000000000 -0400
> +***************
> +*** 142,145 ****
> +--- 142,149 ----
> +      lspec = "";
> +    ret = setlocale (LC_CTYPE, lspec); /* ok, since it does not change locale */
> ++   if (ret == 0 || *ret == 0)
> ++     ret = setlocale (LC_CTYPE, (char *)NULL);
> ++   if (ret == 0 || *ret == 0)
> ++     ret = RL_DEFAULT_LOCALE;
> +  #else
> +    ret = (lspec == 0 || *lspec == 0) ? RL_DEFAULT_LOCALE : lspec;
> +
> +*** ../bash-5.2/patchlevel.h 2020-06-22 14:51:03.000000000 -0400
> +--- patchlevel.h 2020-10-01 11:01:28.000000000 -0400
> +***************
> +*** 26,30 ****
> +     looks for to find the patch level (for the sccs version string). */
> +  
> +! #define PATCHLEVEL 1
> +  
> +  #endif /* _PATCHLEVEL_H_ */
> +--- 26,30 ----
> +     looks for to find the patch level (for the sccs version string). */
> +  
> +! #define PATCHLEVEL 2
> +  
> +  #endif /* _PATCHLEVEL_H_ */
> diff --git a/src/patches/bash/bash52-003 b/src/patches/bash/bash52-003
> new file mode 100644
> index 000000000..b2dc4cbcc
> --- /dev/null
> +++ b/src/patches/bash/bash52-003
> @@ -0,0 +1,89 @@
> +     BASH PATCH REPORT
> +     =================
> +
> +Bash-Release: 5.2
> +Patch-ID: bash52-003
> +
> +Bug-Reported-by: D630 <d630@posteo.net>
> +Bug-Reference-ID: <cf8523d58ac75b9ffba9519faa175618@posteo.de>
> +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2022-10/msg00092.html
> +
> +Bug-Description:
> +
> +Command substitutions need to preserve newlines instead of replacing them
> +with semicolons, especially in the presence of multiple here-documents.
> +
> +Patch (apply with `patch -p0'):
> +
> +*** ../bash-5.2-patched/print_cmd.c 2022-07-26 09:16:39.000000000 -0400
> +--- print_cmd.c 2022-10-17 10:41:06.000000000 -0400
> +***************
> +*** 298,305 ****
> +--- 298,307 ----
> +        {
> +   char c = command->value.Connection->connector;
> ++ int was_newline;
> +  
> +   s[0] = printing_comsub ? c : ';';
> +   s[1] = '\0';
> +  
> ++ was_newline = deferred_heredocs == 0 && was_heredoc == 0 && c == '\n';
> +   if (deferred_heredocs == 0)
> +    {
> +***************
> +*** 315,318 ****
> +--- 317,322 ----
> +   if (inside_function_def)
> +    cprintf ("\n");
> ++ else if (printing_comsub && c == '\n' && was_newline == 0)
> ++  cprintf ("\n"); /* preserve newlines in comsubs but don't double them */
> +   else
> +    {
> +***************
> +*** 1366,1370 ****
> +      }
> +    else
> +!     newline ("}");
> +  
> +    dispose_command (cmdcopy);
> +--- 1371,1379 ----
> +      }
> +    else
> +!     {
> +!       /* { */
> +!       newline ("}");
> +!       was_heredoc = 0; /* not printing any here-documents now */
> +!     }
> +  
> +    dispose_command (cmdcopy);
> +***************
> +*** 1443,1447 ****
> +      }
> +    else
> +!     newline ("}");
> +  
> +    result = the_printed_command;
> +--- 1452,1459 ----
> +      }
> +    else
> +!     { /* { */
> +!       newline ("}");
> +!       was_heredoc = 0;
> +!     }
> +  
> +    result = the_printed_command;
> +*** ../bash-5.2/patchlevel.h 2020-06-22 14:51:03.000000000 -0400
> +--- patchlevel.h 2020-10-01 11:01:28.000000000 -0400
> +***************
> +*** 26,30 ****
> +     looks for to find the patch level (for the sccs version string). */
> +  
> +! #define PATCHLEVEL 2
> +  
> +  #endif /* _PATCHLEVEL_H_ */
> +--- 26,30 ----
> +     looks for to find the patch level (for the sccs version string). */
> +  
> +! #define PATCHLEVEL 3
> +  
> +  #endif /* _PATCHLEVEL_H_ */
> diff --git a/src/patches/bash/bash52-004 b/src/patches/bash/bash52-004
> new file mode 100644
> index 000000000..d0834c19c
> --- /dev/null
> +++ b/src/patches/bash/bash52-004
> @@ -0,0 +1,70 @@
> +     BASH PATCH REPORT
> +     =================
> +
> +Bash-Release: 5.2
> +Patch-ID: bash52-004
> +
> +Bug-Reported-by: Antoine <bug-bash@glitchimini.net>
> +Bug-Reference-ID: <8bd59753-05ff-9b09-2337-2c7f52ded650@glitchimini.net>
> +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2022-10/msg00022.html
> +
> +Bug-Description:
> +
> +Bash needs to keep better track of nested brace expansions to avoid problems
> +with quoting and POSIX semantics.
> +
> +Patch (apply with `patch -p0'):
> +
> +*** ../bash-5.2-patched/subst.c 2022-10-05 10:22:02.000000000 -0400
> +--- subst.c 2022-10-06 15:19:08.000000000 -0400
> +***************
> +*** 1799,1802 ****
> +--- 1804,1810 ----
> +  }
> +  
> ++ #define PARAMEXPNEST_MAX 32 // for now
> ++ static int dbstate[PARAMEXPNEST_MAX];
> ++ 
> +  /* Extract a parameter expansion expression within ${ and } from STRING.
> +     Obey the Posix.2 rules for finding the ending `}': count braces while
> +***************
> +*** 1829,1832 ****
> +--- 1837,1842 ----
> +      return (extract_heredoc_dolbrace_string (string, sindex, quoted, flags));
> +  
> ++   dbstate[0] = dolbrace_state;
> ++ 
> +    pass_character = 0;
> +    nesting_level = 1;
> +***************
> +*** 1853,1856 ****
> +--- 1863,1868 ----
> +        if (string[i] == '$' && string[i+1] == LBRACE)
> +   {
> ++  if (nesting_level < PARAMEXPNEST_MAX)
> ++    dbstate[nesting_level] = dolbrace_state;
> +    nesting_level++;
> +    i += 2;
> +***************
> +*** 1865,1868 ****
> +--- 1877,1881 ----
> +    if (nesting_level == 0)
> +      break;
> ++  dolbrace_state = (nesting_level < PARAMEXPNEST_MAX) ? dbstate[nesting_level] : dbstate[0]; /* Guess using initial state */
> +    i++;
> +    continue;
> +*** ../bash-5.2/patchlevel.h 2020-06-22 14:51:03.000000000 -0400
> +--- patchlevel.h 2020-10-01 11:01:28.000000000 -0400
> +***************
> +*** 26,30 ****
> +     looks for to find the patch level (for the sccs version string). */
> +  
> +! #define PATCHLEVEL 3
> +  
> +  #endif /* _PATCHLEVEL_H_ */
> +--- 26,30 ----
> +     looks for to find the patch level (for the sccs version string). */
> +  
> +! #define PATCHLEVEL 4
> +  
> +  #endif /* _PATCHLEVEL_H_ */
> diff --git a/src/patches/bash/bash52-005 b/src/patches/bash/bash52-005
> new file mode 100644
> index 000000000..3f6a85215
> --- /dev/null
> +++ b/src/patches/bash/bash52-005
> @@ -0,0 +1,47 @@
> +     BASH PATCH REPORT
> +     =================
> +
> +Bash-Release: 5.2
> +Patch-ID: bash52-005
> +
> +Bug-Reported-by: Justin Wood (Callek) <callek@gmail.com>
> +Bug-Reference-ID: <CANBDKY9fp2yiXONP7RY4kNuRteuovUebxSJaqePHeu7cyaFS9Q@mail.gmail.com>
> +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2022-10/msg00088.html
> +
> +Bug-Description:
> +
> +Null pattern substitution replacement strings can cause a crash.
> +
> +Patch (apply with `patch -p0'):
> +
> +*** ../bash-5.2-patched/subst.c 2022-10-05 10:22:02.000000000 -0400
> +--- subst.c 2022-10-13 16:57:26.000000000 -0400
> +***************
> +*** 8966,8970 ****
> +      }
> +    else if (*string == 0 && (match_pattern (string, pat, mtype, &s, &e) != 0))
> +!     return ((mflags & MATCH_EXPREP) ? strcreplace (rep, '&', "", 2) : savestring (rep));
> +  
> +    ret = (char *)xmalloc (rsize = 64);
> +--- 8966,8971 ----
> +      }
> +    else if (*string == 0 && (match_pattern (string, pat, mtype, &s, &e) != 0))
> +!     return (mflags & MATCH_EXPREP) ? strcreplace (rep, '&', "", 2)
> +!   : (rep ? savestring (rep) : savestring (""));
> +  
> +    ret = (char *)xmalloc (rsize = 64);
> +*** ../bash-5.2/patchlevel.h 2020-06-22 14:51:03.000000000 -0400
> +--- patchlevel.h 2020-10-01 11:01:28.000000000 -0400
> +***************
> +*** 26,30 ****
> +     looks for to find the patch level (for the sccs version string). */
> +  
> +! #define PATCHLEVEL 4
> +  
> +  #endif /* _PATCHLEVEL_H_ */
> +--- 26,30 ----
> +     looks for to find the patch level (for the sccs version string). */
> +  
> +! #define PATCHLEVEL 5
> +  
> +  #endif /* _PATCHLEVEL_H_ */
> diff --git a/src/patches/bash/bash52-006 b/src/patches/bash/bash52-006
> new file mode 100644
> index 000000000..851cfd7b6
> --- /dev/null
> +++ b/src/patches/bash/bash52-006
> @@ -0,0 +1,293 @@
> +     BASH PATCH REPORT
> +     =================
> +
> +Bash-Release: 5.2
> +Patch-ID: bash52-006
> +
> +Bug-Reported-by: feng xiangjun <fengxj325@gmail.com>
> +Bug-Reference-ID: <CAHH2t87LrCmO=gdyWOmGn5WJt7EucL+iOXzrry34OETe50S6uA@mail.gmail.com>
> +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2022-10/msg00089.html
> +
> +Bug-Description:
> +
> +In interactive shells, interrupting the shell while entering a command
> +substitution can inhibit alias expansion.
> +
> +Patch (apply with `patch -p0'):
> +
> +*** ../bash-5.2-patched/parse.y 2022-10-08 13:10:06.000000000 -0400
> +--- parse.y 2022-10-14 10:03:19.000000000 -0400
> +***************
> +*** 3307,3310 ****
> +--- 3307,3312 ----
> +      extended_glob = global_extglob;
> +  #endif
> ++   if (parser_state & (PST_CMDSUBST|PST_STRING))
> ++     expand_aliases = expaliases_flag;
> +  
> +    parser_state = 0;
> +***************
> +*** 4389,4392 ****
> +--- 4391,4395 ----
> +      parser_state |= PST_NOERROR;
> +  
> ++   parser_state |= PST_STRING;
> +    expand_aliases = 0;
> +  
> +***************
> +*** 6402,6406 ****
> +        parser_state &= ~PST_NOEXPAND; /* parse_comsub sentinel */
> +        /* State flags we want to set for this run through the tokenizer. */
> +!       parser_state |= PST_COMPASSIGN|PST_REPARSE;
> +      }
> +  
> +--- 6405,6409 ----
> +        parser_state &= ~PST_NOEXPAND; /* parse_comsub sentinel */
> +        /* State flags we want to set for this run through the tokenizer. */
> +!       parser_state |= PST_COMPASSIGN|PST_REPARSE|PST_STRING;
> +      }
> +  
> +*** ../bash-20221007/parser.h 2022-08-30 11:39:56.000000000 -0400
> +--- parser.h 2022-10-14 09:56:18.000000000 -0400
> +***************
> +*** 51,54 ****
> +--- 51,55 ----
> +  #define PST_NOEXPAND 0x400000 /* don't expand anything in read_token_word; for command substitution */
> +  #define PST_NOERROR 0x800000 /* don't print error messages in yyerror */
> ++ #define PST_STRING 0x1000000 /* parsing a string to a command or word list */
> +  
> +  /* Definition of the delimiter stack.  Needed by parse.y and bashhist.c. */
> +*** ../bash-20221007/builtins/shopt.def 2022-10-07 10:25:55.000000000 -0400
> +--- builtins/shopt.def 2022-10-14 09:30:11.000000000 -0400
> +***************
> +*** 150,153 ****
> +--- 150,156 ----
> +  #endif
> +  
> ++ int expaliases_flag = 0;
> ++ static int shopt_set_expaliases PARAMS((char *, int));
> ++ 
> +  static int shopt_set_debug_mode PARAMS((char *, int));
> +  
> +***************
> +*** 199,203 ****
> +    { "dotglob", &glob_dot_filenames, (shopt_set_func_t *)NULL },
> +    { "execfail", &no_exit_on_failed_exec, (shopt_set_func_t *)NULL },
> +!   { "expand_aliases", &expand_aliases, (shopt_set_func_t *)NULL },
> +  #if defined (DEBUGGER)
> +    { "extdebug", &debugging_mode, shopt_set_debug_mode },
> +--- 202,206 ----
> +    { "dotglob", &glob_dot_filenames, (shopt_set_func_t *)NULL },
> +    { "execfail", &no_exit_on_failed_exec, (shopt_set_func_t *)NULL },
> +!   { "expand_aliases", &expaliases_flag, shopt_set_expaliases },
> +  #if defined (DEBUGGER)
> +    { "extdebug", &debugging_mode, shopt_set_debug_mode },
> +***************
> +*** 351,355 ****
> +    allow_null_glob_expansion = glob_dot_filenames = 0;
> +    no_exit_on_failed_exec = 0;
> +!   expand_aliases = 0;
> +    extended_quote = 1;
> +    fail_glob_expansion = 0;
> +--- 354,358 ----
> +    allow_null_glob_expansion = glob_dot_filenames = 0;
> +    no_exit_on_failed_exec = 0;
> +!   expand_aliases = expaliases_flag = 0;
> +    extended_quote = 1;
> +    fail_glob_expansion = 0;
> +***************
> +*** 632,635 ****
> +--- 635,647 ----
> +  }
> +  
> ++ static int
> ++ shopt_set_expaliases (option_name, mode)
> ++      char *option_name;
> ++      int mode;
> ++ {
> ++   expand_aliases = expaliases_flag;
> ++   return 0;
> ++ }
> ++ 
> +  #if defined (READLINE)
> +  static int
> +*** ../bash-20221007/builtins/common.h 2022-10-07 10:10:17.000000000 -0400
> +--- builtins/common.h 2022-10-14 09:29:25.000000000 -0400
> +***************
> +*** 258,261 ****
> +--- 258,263 ----
> +  #endif
> +  
> ++ extern int expaliases_flag;
> ++ 
> +  /* variables from source.def */
> +  extern int source_searches_cwd;
> +*** ../bash-20221007/execute_cmd.c 2022-10-10 10:48:54.000000000 -0400
> +--- execute_cmd.c 2022-10-14 09:32:24.000000000 -0400
> +***************
> +*** 1537,1541 ****
> +   aliases. */
> +        if (ois != interactive_shell)
> +! expand_aliases = 0;
> +      }
> +  
> +--- 1537,1541 ----
> +   aliases. */
> +        if (ois != interactive_shell)
> +! expand_aliases = expaliases_flag = 0;
> +      }
> +  
> +*** ../bash-20221007/general.c 2021-11-04 14:12:38.000000000 -0400
> +--- general.c 2022-10-14 09:34:24.000000000 -0400
> +***************
> +*** 92,96 ****
> +    &interactive_comments,
> +    &source_uses_path,
> +!   &expand_aliases,
> +    &inherit_errexit,
> +    &print_shift_error,
> +--- 92,96 ----
> +    &interactive_comments,
> +    &source_uses_path,
> +!   &expaliases_flag,
> +    &inherit_errexit,
> +    &print_shift_error,
> +***************
> +*** 107,111 ****
> +    if (on != 0)
> +      {
> +!       interactive_comments = source_uses_path = expand_aliases = 1;
> +        inherit_errexit = 1;
> +        source_searches_cwd = 0;
> +--- 107,112 ----
> +    if (on != 0)
> +      {
> +!       interactive_comments = source_uses_path = 1;
> +!       expand_aliases = expaliases_flag = 1;
> +        inherit_errexit = 1;
> +        source_searches_cwd = 0;
> +***************
> +*** 117,120 ****
> +--- 118,122 ----
> +      {
> +        set_posix_options (saved_posix_vars);
> ++       expand_aliases = expaliases_flag;
> +        free (saved_posix_vars);
> +        saved_posix_vars = 0;
> +***************
> +*** 123,127 ****
> +      {
> +        source_searches_cwd = 1;
> +!       expand_aliases = interactive_shell;
> +        print_shift_error = 0;
> +      }
> +--- 125,129 ----
> +      {
> +        source_searches_cwd = 1;
> +!       expand_aliases = expaliases_flag = interactive_shell; /* XXX */
> +        print_shift_error = 0;
> +      }
> +
> +*** ../bash-5.2-patched/shell.c 2022-03-04 15:13:00.000000000 -0500
> +--- shell.c 2022-10-14 09:36:19.000000000 -0400
> +***************
> +*** 1845,1850 ****
> +  init_interactive ()
> +  {
> +!   expand_aliases = interactive_shell = startup_state = 1;
> +!   interactive = 1;
> +  #if defined (HISTORY)
> +    if (enable_history_list == -1)
> +--- 1845,1850 ----
> +  init_interactive ()
> +  {
> +!   expand_aliases = expaliases_flag = 1;
> +!   interactive_shell = startup_state = interactive = 1;
> +  #if defined (HISTORY)
> +    if (enable_history_list == -1)
> +***************
> +*** 1866,1870 ****
> +  #endif /* HISTORY */
> +    interactive_shell = startup_state = interactive = 0;
> +!   expand_aliases = posixly_correct; /* XXX - was 0 not posixly_correct */
> +    no_line_editing = 1;
> +  #if defined (JOB_CONTROL)
> +--- 1866,1870 ----
> +  #endif /* HISTORY */
> +    interactive_shell = startup_state = interactive = 0;
> +!   expand_aliases = expaliases_flag = posixly_correct; /* XXX - was 0 not posixly_correct */
> +    no_line_editing = 1;
> +  #if defined (JOB_CONTROL)
> +***************
> +*** 1883,1887 ****
> +  #endif
> +    init_noninteractive ();
> +!   expand_aliases = interactive_shell = startup_state = 1;
> +  #if defined (HISTORY)
> +    remember_on_history = enable_history_list; /* XXX */
> +--- 1883,1887 ----
> +  #endif
> +    init_noninteractive ();
> +!   expand_aliases = expaliases_flag = interactive_shell = startup_state = 1;
> +  #if defined (HISTORY)
> +    remember_on_history = enable_history_list; /* XXX */
> +***************
> +*** 2026,2030 ****
> +    forced_interactive = interactive_shell = 0;
> +    subshell_environment = running_in_background = 0;
> +!   expand_aliases = 0;
> +    bash_argv_initialized = 0;
> +  
> +--- 2026,2030 ----
> +    forced_interactive = interactive_shell = 0;
> +    subshell_environment = running_in_background = 0;
> +!   expand_aliases = expaliases_flag = 0;
> +    bash_argv_initialized = 0;
> +  
> +*** ../bash-5.2-patched/y.tab.c 2022-09-23 10:18:27.000000000 -0400
> +--- y.tab.c 2022-10-14 14:57:26.000000000 -0400
> +***************
> +*** 5618,5621 ****
> +--- 5618,5623 ----
> +      extended_glob = global_extglob;
> +  #endif
> ++   if (parser_state & (PST_CMDSUBST|PST_STRING))
> ++     expand_aliases = expaliases_flag;
> +  
> +    parser_state = 0;
> +***************
> +*** 6700,6703 ****
> +--- 6702,6706 ----
> +      parser_state |= PST_NOERROR;
> +  
> ++   parser_state |= PST_STRING;
> +    expand_aliases = 0;
> +  
> +***************
> +*** 8713,8717 ****
> +        parser_state &= ~PST_NOEXPAND; /* parse_comsub sentinel */
> +        /* State flags we want to set for this run through the tokenizer. */
> +!       parser_state |= PST_COMPASSIGN|PST_REPARSE;
> +      }
> +  
> +--- 8716,8720 ----
> +        parser_state &= ~PST_NOEXPAND; /* parse_comsub sentinel */
> +        /* State flags we want to set for this run through the tokenizer. */
> +!       parser_state |= PST_COMPASSIGN|PST_REPARSE|PST_STRING;
> +      }
> +  
> +*** ../bash-5.2/patchlevel.h 2020-06-22 14:51:03.000000000 -0400
> +--- patchlevel.h 2020-10-01 11:01:28.000000000 -0400
> +***************
> +*** 26,30 ****
> +     looks for to find the patch level (for the sccs version string). */
> +  
> +! #define PATCHLEVEL 5
> +  
> +  #endif /* _PATCHLEVEL_H_ */
> +--- 26,30 ----
> +     looks for to find the patch level (for the sccs version string). */
> +  
> +! #define PATCHLEVEL 6
> +  
> +  #endif /* _PATCHLEVEL_H_ */
> diff --git a/src/patches/bash/bash52-007 b/src/patches/bash/bash52-007
> new file mode 100644
> index 000000000..152776f4b
> --- /dev/null
> +++ b/src/patches/bash/bash52-007
> @@ -0,0 +1,262 @@
> +     BASH PATCH REPORT
> +     =================
> +
> +Bash-Release: 5.2
> +Patch-ID: bash52-007
> +
> +Bug-Reported-by: Bruce Jerrick
> +Bug-Reference-ID:
> +Bug-Reference-URL: https://bugzilla.redhat.com/show_bug.cgi?id=2134307
> +
> +Bug-Description:
> +
> +This patch fixes several problems with alias expansion inside command
> +substitutions when in POSIX mode.
> +
> +Patch (apply with `patch -p0'):
> +
> +*** /fs1/chet/scratch/bash-5.2.6/parse.y 2022-11-02 10:36:54.000000000 -0400
> +--- parse.y 2022-10-24 10:53:26.000000000 -0400
> +***************
> +*** 3613,3616 ****
> +--- 3614,3618 ----
> +  #define P_ARRAYSUB 0x0020 /* parsing a [...] array subscript for assignment */
> +  #define P_DOLBRACE 0x0040 /* parsing a ${...} construct */
> ++ #define P_ARITH 0x0080 /* parsing a $(( )) arithmetic expansion */
> +  
> +  /* Lexical state while parsing a grouping construct or $(...). */
> +***************
> +*** 3911,3914 ****
> +--- 3914,3920 ----
> +    else if ((flags & (P_ARRAYSUB|P_DOLBRACE)) && (tflags & LEX_WASDOL) && (ch == '(' || ch == '{' || ch == '[')) /* ) } ] */
> +      goto parse_dollar_word;
> ++  else if ((flags & P_ARITH) && (tflags & LEX_WASDOL) && ch == '(') /*)*/
> ++    /* $() inside $(( ))/$[ ] */
> ++    goto parse_dollar_word;
> +  #if defined (PROCESS_SUBSTITUTION)
> +    /* XXX - technically this should only be recognized at the start of
> +***************
> +*** 3941,3945 ****
> +      nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|P_DOLBRACE|rflags);
> +    else if (ch == '[') /* ] */
> +!    nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags);
> +  
> +    CHECK_NESTRET_ERROR ();
> +--- 3947,3951 ----
> +      nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|P_DOLBRACE|rflags);
> +    else if (ch == '[') /* ] */
> +!    nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags|P_ARITH);
> +  
> +    CHECK_NESTRET_ERROR ();
> +***************
> +*** 4080,4084 ****
> +        shell_ungetc (peekc);
> +        if (peekc == '(') /*)*/
> +! return (parse_matched_pair (qc, open, close, lenp, 0));
> +      }
> +  
> +--- 4086,4090 ----
> +        shell_ungetc (peekc);
> +        if (peekc == '(') /*)*/
> +! return (parse_matched_pair (qc, open, close, lenp, P_ARITH));
> +      }
> +  
> +***************
> +*** 4501,4505 ****
> +  
> +    exp_lineno = line_number;
> +!   ttok = parse_matched_pair (0, '(', ')', &ttoklen, 0);
> +    rval = 1;
> +    if (ttok == &matched_pair_error)
> +--- 4512,4516 ----
> +  
> +    exp_lineno = line_number;
> +!   ttok = parse_matched_pair (0, '(', ')', &ttoklen, P_ARITH);
> +    rval = 1;
> +    if (ttok == &matched_pair_error)
> +***************
> +*** 5016,5020 ****
> +   }
> +        else
> +! ttok = parse_matched_pair (cd, '[', ']', &ttoklen, 0);
> +        if (ttok == &matched_pair_error)
> +   return -1; /* Bail immediately. */
> +--- 5030,5034 ----
> +   }
> +        else
> +! ttok = parse_matched_pair (cd, '[', ']', &ttoklen, P_ARITH);
> +        if (ttok == &matched_pair_error)
> +   return -1; /* Bail immediately. */
> +*** ../bash-5.2.6/y.tab.c 2022-11-02 10:36:54.000000000 -0400
> +--- y.tab.c 2022-11-02 10:55:58.000000000 -0400
> +***************
> +*** 5924,5927 ****
> +--- 5924,5928 ----
> +  #define P_ARRAYSUB 0x0020 /* parsing a [...] array subscript for assignment */
> +  #define P_DOLBRACE 0x0040 /* parsing a ${...} construct */
> ++ #define P_ARITH 0x0080 /* parsing a $(( )) arithmetic expansion */
> +  
> +  /* Lexical state while parsing a grouping construct or $(...). */
> +***************
> +*** 6222,6225 ****
> +--- 6223,6229 ----
> +    else if ((flags & (P_ARRAYSUB|P_DOLBRACE)) && (tflags & LEX_WASDOL) && (ch == '(' || ch == '{' || ch == '[')) /* ) } ] */
> +      goto parse_dollar_word;
> ++  else if ((flags & P_ARITH) && (tflags & LEX_WASDOL) && ch == '(') /*)*/
> ++    /* $() inside $(( ))/$[ ] */
> ++    goto parse_dollar_word;
> +  #if defined (PROCESS_SUBSTITUTION)
> +    /* XXX - technically this should only be recognized at the start of
> +***************
> +*** 6252,6256 ****
> +      nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|P_DOLBRACE|rflags);
> +    else if (ch == '[') /* ] */
> +!    nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags);
> +  
> +    CHECK_NESTRET_ERROR ();
> +--- 6256,6260 ----
> +      nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|P_DOLBRACE|rflags);
> +    else if (ch == '[') /* ] */
> +!    nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags|P_ARITH);
> +  
> +    CHECK_NESTRET_ERROR ();
> +***************
> +*** 6391,6395 ****
> +        shell_ungetc (peekc);
> +        if (peekc == '(') /*)*/
> +! return (parse_matched_pair (qc, open, close, lenp, 0));
> +      }
> +  
> +--- 6395,6399 ----
> +        shell_ungetc (peekc);
> +        if (peekc == '(') /*)*/
> +! return (parse_matched_pair (qc, open, close, lenp, P_ARITH));
> +      }
> +  
> +***************
> +*** 6812,6816 ****
> +  
> +    exp_lineno = line_number;
> +!   ttok = parse_matched_pair (0, '(', ')', &ttoklen, 0);
> +    rval = 1;
> +    if (ttok == &matched_pair_error)
> +--- 6816,6820 ----
> +  
> +    exp_lineno = line_number;
> +!   ttok = parse_matched_pair (0, '(', ')', &ttoklen, P_ARITH);
> +    rval = 1;
> +    if (ttok == &matched_pair_error)
> +***************
> +*** 7327,7331 ****
> +   }
> +        else
> +! ttok = parse_matched_pair (cd, '[', ']', &ttoklen, 0);
> +        if (ttok == &matched_pair_error)
> +   return -1; /* Bail immediately. */
> +--- 7331,7335 ----
> +   }
> +        else
> +! ttok = parse_matched_pair (cd, '[', ']', &ttoklen, P_ARITH);
> +        if (ttok == &matched_pair_error)
> +   return -1; /* Bail immediately. */
> +*** /fs1/chet/scratch/bash-5.2.6/builtins/evalstring.c 2022-07-18 14:46:56.000000000 -0400
> +--- builtins/evalstring.c 2022-10-18 10:57:51.000000000 -0400
> +***************
> +*** 432,435 ****
> +--- 432,437 ----
> +        if (parse_command () == 0)
> +   {
> ++  int local_expalias, local_alflag;
> ++ 
> +    if ((flags & SEVAL_PARSEONLY) || (interactive_shell == 0 && read_but_dont_execute))
> +      {
> +***************
> +*** 508,511 ****
> +--- 510,526 ----
> +  #endif /* ONESHOT */
> +  
> ++      /* We play tricks in the parser and command_substitute() turning
> ++ expand_aliases on and off depending on which parsing pass and
> ++ whether or not we're in posix mode. This only matters for
> ++ parsing, and we let the higher layers deal with that. We just
> ++ want to ensure that expand_aliases is set to the appropriate
> ++ global value when we go to execute this command, so we save
> ++ and restore it around the execution (we don't restore it if
> ++ the global value of the flag (expaliases_flag) changes). */
> ++      local_expalias = expand_aliases;
> ++      local_alflag = expaliases_flag;
> ++      if (subshell_environment & SUBSHELL_COMSUB)
> ++ expand_aliases = expaliases_flag;
> ++ 
> +        /* See if this is a candidate for $( <file ). */
> +        if (startup_state == 2 &&
> +***************
> +*** 525,528 ****
> +--- 540,547 ----
> +        discard_unwind_frame ("pe_dispose");
> +  
> ++      /* If the global value didn't change, we restore what we had. */
> ++      if ((subshell_environment & SUBSHELL_COMSUB) && local_alflag == expaliases_flag)
> ++ expand_aliases = local_expalias;
> ++ 
> +        if (flags & SEVAL_ONECMD)
> +   {
> +*** /fs1/chet/scratch/bash-5.2.6/command.h 2021-04-30 15:43:15.000000000 -0400
> +--- command.h 2022-10-18 11:44:31.000000000 -0400
> +***************
> +*** 115,118 ****
> +--- 115,119 ----
> +  #define PF_EXPANDRHS 0x20 /* same as W_EXPANDRHS */
> +  #define PF_ALLINDS 0x40 /* array, act as if [@] was supplied */
> ++ #define PF_BACKQUOTE 0x80 /* differentiate `` from $() for command_substitute */
> +  
> +  /* Possible values for subshell_environment */
> +*** /fs1/chet/scratch/bash-5.2.6/subst.c 2022-11-02 10:28:10.000000000 -0400
> +--- subst.c 2022-10-20 12:41:07.000000000 -0400
> +***************
> +*** 7124,7129 ****
> +  
> +        /* We want to expand aliases on this pass if we are not in posix mode
> +! for backwards compatibility. */
> +!       if (expand_aliases)
> +          expand_aliases = posixly_correct == 0;
> +  
> +--- 7133,7142 ----
> +  
> +        /* We want to expand aliases on this pass if we are not in posix mode
> +! for backwards compatibility. parse_and_execute() takes care of
> +! setting expand_aliases back to the global value when executing the
> +! parsed string. We only do this for $(...) command substitution,
> +! since that is what parse_comsub handles; `` comsubs are processed
> +! using parse.y:parse_matched_pair(). */
> +!       if (expand_aliases && (flags & PF_BACKQUOTE) == 0)
> +          expand_aliases = posixly_correct == 0;
> +  
> +***************
> +*** 11293,11297 ****
> +        {
> +   de_backslash (temp);
> +! tword = command_substitute (temp, quoted, 0);
> +   temp1 = tword ? tword->word : (char *)NULL;
> +   if (tword)
> +--- 11306,11310 ----
> +        {
> +   de_backslash (temp);
> +! tword = command_substitute (temp, quoted, PF_BACKQUOTE);
> +   temp1 = tword ? tword->word : (char *)NULL;
> +   if (tword)
> +*** ../bash-5.2/patchlevel.h 2020-06-22 14:51:03.000000000 -0400
> +--- patchlevel.h 2020-10-01 11:01:28.000000000 -0400
> +***************
> +*** 26,30 ****
> +     looks for to find the patch level (for the sccs version string). */
> +  
> +! #define PATCHLEVEL 6
> +  
> +  #endif /* _PATCHLEVEL_H_ */
> +--- 26,30 ----
> +     looks for to find the patch level (for the sccs version string). */
> +  
> +! #define PATCHLEVEL 7
> +  
> +  #endif /* _PATCHLEVEL_H_ */
> diff --git a/src/patches/bash/bash52-008 b/src/patches/bash/bash52-008
> new file mode 100644
> index 000000000..ff6371140
> --- /dev/null
> +++ b/src/patches/bash/bash52-008
> @@ -0,0 +1,58 @@
> +     BASH PATCH REPORT
> +     =================
> +
> +Bash-Release: 5.2
> +Patch-ID: bash52-008
> +
> +Bug-Reported-by: Glenn Jackman <glenn.jackman@gmail.com>
> +Bug-Reference-ID: <CAFC8ewQDx7hzNJzveuJ5o4FWo=ij7MzckiJVN_6NXjp504QZeg@mail.gmail.com>
> +Bug-Reference-URL: https://lists.gnu.org/archive/html/bug-bash/2022-10/msg00095.html
> +
> +Bug-Description:
> +
> +Array subscript expansion can inappropriately quote brackets if the expression
> +contains < or >.
> +
> +Patch (apply with `patch -p0'):
> +
> +*** ../bash-20221015/subst.c 2022-10-18 10:47:33.000000000 -0500
> +--- subst.c 2022-10-20 11:41:07.000000000 -0500
> +***************
> +*** 3820,3823 ****
> +--- 3820,3827 ----
> +  #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 == '~')
> ++ 
> +  /* If there are any characters in STRING that require full expansion,
> +     then call FUNC to expand STRING; otherwise just perform quote
> +***************
> +*** 4029,4033 ****
> +    while (string[i])
> +      {
> +!       if (EXP_CHAR (string[i]))
> +   break;
> +        else if (string[i] == '\'' || string[i] == '\\' || string[i] == '"')
> +--- 4033,4037 ----
> +    while (string[i])
> +      {
> +!       if (ARITH_EXP_CHAR (string[i]))
> +   break;
> +        else if (string[i] == '\'' || string[i] == '\\' || string[i] == '"')
> +*** ../bash-5.2/patchlevel.h 2020-06-22 14:51:03.000000000 -0400
> +--- patchlevel.h 2020-10-01 11:01:28.000000000 -0400
> +***************
> +*** 26,30 ****
> +     looks for to find the patch level (for the sccs version string). */
> +  
> +! #define PATCHLEVEL 7
> +  
> +  #endif /* _PATCHLEVEL_H_ */
> +--- 26,30 ----
> +     looks for to find the patch level (for the sccs version string). */
> +  
> +! #define PATCHLEVEL 8
> +  
> +  #endif /* _PATCHLEVEL_H_ */
> diff --git a/src/patches/bash/bash52-009 b/src/patches/bash/bash52-009
> new file mode 100644
> index 000000000..f907c8c47
> --- /dev/null
> +++ b/src/patches/bash/bash52-009
> @@ -0,0 +1,43 @@
> +     BASH PATCH REPORT
> +     =================
> +
> +Bash-Release: 5.2
> +Patch-ID: bash52-009
> +
> +Bug-Reported-by: Corey Hickey <bugfood-ml@fatooh.org>
> +Bug-Reference-ID: <134330ef-0ead-d73e-68eb-d58fc51efdba@fatooh.org>
> +Bug-Reference-URL: https://lists.gnu.org/archive/html/help-bash/2022-10/msg00025.html
> +
> +Bug-Description:
> +
> +Bash arithmetic expansion should allow `@' and `*' to be used as associative
> +array keys in expressions.
> +
> +Patch (apply with `patch -p0'):
> +
> +*** ../bash-5.2-patched/expr.c 2022-07-11 10:03:34.000000000 -0400
> +--- expr.c 2022-10-31 10:51:08.000000000 -0400
> +***************
> +*** 1169,1172 ****
> +--- 1169,1174 ----
> +  #if defined (ARRAY_VARS)
> +    aflag = tflag; /* use a different variable for now */
> ++   if (shell_compatibility_level > 51)
> ++     aflag |= AV_ATSTARKEYS;
> +    v = (e == ']') ? array_variable_part (tok, tflag, (char **)0, (int *)0) : find_variable (tok);
> +  #else
> +*** ../bash-5.2/patchlevel.h 2020-06-22 14:51:03.000000000 -0400
> +--- patchlevel.h 2020-10-01 11:01:28.000000000 -0400
> +***************
> +*** 26,30 ****
> +     looks for to find the patch level (for the sccs version string). */
> +  
> +! #define PATCHLEVEL 8
> +  
> +  #endif /* _PATCHLEVEL_H_ */
> +--- 26,30 ----
> +     looks for to find the patch level (for the sccs version string). */
> +  
> +! #define PATCHLEVEL 9
> +  
> +  #endif /* _PATCHLEVEL_H_ */
> -- 
> 2.38.1
>
  

Patch

diff --git a/config/rootfiles/common/bash b/config/rootfiles/common/bash
index c28d3571a..f348b5366 100644
--- a/config/rootfiles/common/bash
+++ b/config/rootfiles/common/bash
@@ -21,6 +21,7 @@ 
 #usr/include/bash/conftypes.h
 #usr/include/bash/dispose_cmd.h
 #usr/include/bash/error.h
+#usr/include/bash/execute_cmd.h
 #usr/include/bash/externs.h
 #usr/include/bash/general.h
 #usr/include/bash/hashlib.h
@@ -62,13 +63,16 @@ 
 #usr/include/bash/y.tab.h
 #usr/lib/bash
 usr/lib/bash/Makefile.inc
+usr/lib/bash/Makefile.sample
 usr/lib/bash/accept
 usr/lib/bash/basename
 usr/lib/bash/csv
 usr/lib/bash/cut
 usr/lib/bash/dirname
+usr/lib/bash/dsv
 usr/lib/bash/fdflags
 usr/lib/bash/finfo
+usr/lib/bash/getconf
 usr/lib/bash/head
 usr/lib/bash/id
 usr/lib/bash/ln
@@ -88,6 +92,7 @@  usr/lib/bash/rmdir
 usr/lib/bash/seq
 usr/lib/bash/setpgid
 usr/lib/bash/sleep
+usr/lib/bash/stat
 usr/lib/bash/strftime
 usr/lib/bash/sync
 usr/lib/bash/tee
diff --git a/lfs/bash b/lfs/bash
index ec8939aed..14b20b986 100644
--- a/lfs/bash
+++ b/lfs/bash
@@ -24,7 +24,7 @@ 
 
 include Config
 
-VER        = 5.1.16
+VER        = 5.2
 
 THISAPP    = bash-$(VER)
 DL_FILE    = $(THISAPP).tar.gz
@@ -53,7 +53,7 @@  objects = $(DL_FILE)
 
 $(DL_FILE)             = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_BLAKE2 = 0bc53b24d9b95cd85e45196510104acf6ac6c980f68aedcc83c8409ce6a4682e92736a9cbe089ed92d74590e28918d0bee0e67c8e0f994bd37e45fad83f5b48e
+$(DL_FILE)_BLAKE2 = 51b196e710794ebad8eac28c31c93eb99ac1a7db30919a13271e39e1cb66a0672f242df75fc7d71627ea873dfbce53ec35c0c56a71c5167143070a7811343fd9
 
 install : $(TARGET)
 
@@ -90,6 +90,11 @@  $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
 	cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/bash/bash-4.0-paths-1.patch
 	cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/bash/bash-4.0-profile-1.patch
 	cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/bash/bash-3.2-ssh_source_bash.patch
+	
+	for i in $$(seq 1 9); do \
+	cd $(DIR_APP) && patch -Np0 < $(DIR_SRC)/src/patches/bash/bash52-$$(printf "%03d" "$${i}") || exit 1; \
+	done
+
 
 	cd $(DIR_APP) && ./configure --prefix=$(PREFIX) $(CONFIGURE_OPTIONS)
 	cd $(DIR_APP) && make $(MAKETUNING)
diff --git a/src/patches/bash/bash52-001 b/src/patches/bash/bash52-001
new file mode 100644
index 000000000..83776ec76
--- /dev/null
+++ b/src/patches/bash/bash52-001
@@ -0,0 +1,46 @@ 
+			     BASH PATCH REPORT
+			     =================
+
+Bash-Release:	5.2
+Patch-ID:	bash52-001
+
+Bug-Reported-by:	Emanuele Torre <torreemanuele6@gmail.com>
+Bug-Reference-ID:	<CAA7hNqeR1eSdiGK8mjQSqJPo815JYoG-Ekz-5PrAJTEYy2e6hg@mail.gmail.com>
+Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2022-09/msg00060.html
+
+Bug-Description:
+
+Expanding unset arrays in an arithmetic context can cause a segmentation fault.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.2/subst.c	2022-08-31 17:36:46.000000000 -0400
+--- subst.c	2022-09-30 09:12:05.000000000 -0400
+***************
+*** 10858,10862 ****
+    t = expand_subscript_string (exp, quoted & ~(Q_ARITH|Q_DOUBLE_QUOTES));
+    free (exp);
+!   exp = sh_backslash_quote (t, abstab, 0);
+    free (t);
+  
+--- 10858,10862 ----
+    t = expand_subscript_string (exp, quoted & ~(Q_ARITH|Q_DOUBLE_QUOTES));
+    free (exp);
+!   exp = t ? sh_backslash_quote (t, abstab, 0) : savestring ("");
+    free (t);
+  
+*** ../bash-5.2/patchlevel.h	2020-06-22 14:51:03.000000000 -0400
+--- patchlevel.h	2020-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 0
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 1
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash52-002 b/src/patches/bash/bash52-002
new file mode 100644
index 000000000..18229c996
--- /dev/null
+++ b/src/patches/bash/bash52-002
@@ -0,0 +1,46 @@ 
+			     BASH PATCH REPORT
+			     =================
+
+Bash-Release:	5.2
+Patch-ID:	bash52-002
+
+Bug-Reported-by:	Kan-Ru Chen <koster@debian.org>
+Bug-Reference-ID:
+Bug-Reference-URL:	https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1021109
+
+Bug-Description:
+
+Starting bash with an invalid locale specification for LC_ALL/LANG/LC_CTYPE
+can cause the shell to crash.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.2-patched/lib/readline/nls.c	2022-08-15 09:38:51.000000000 -0400
+--- lib/readline/nls.c	2022-10-05 09:23:22.000000000 -0400
+***************
+*** 142,145 ****
+--- 142,149 ----
+      lspec = "";
+    ret = setlocale (LC_CTYPE, lspec);	/* ok, since it does not change locale */
++   if (ret == 0 || *ret == 0)
++     ret = setlocale (LC_CTYPE, (char *)NULL);
++   if (ret == 0 || *ret == 0)
++     ret = RL_DEFAULT_LOCALE;
+  #else
+    ret = (lspec == 0 || *lspec == 0) ? RL_DEFAULT_LOCALE : lspec;
+
+*** ../bash-5.2/patchlevel.h	2020-06-22 14:51:03.000000000 -0400
+--- patchlevel.h	2020-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 1
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 2
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash52-003 b/src/patches/bash/bash52-003
new file mode 100644
index 000000000..b2dc4cbcc
--- /dev/null
+++ b/src/patches/bash/bash52-003
@@ -0,0 +1,89 @@ 
+			     BASH PATCH REPORT
+			     =================
+
+Bash-Release:	5.2
+Patch-ID:	bash52-003
+
+Bug-Reported-by:	 D630 <d630@posteo.net>
+Bug-Reference-ID:	<cf8523d58ac75b9ffba9519faa175618@posteo.de>
+Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2022-10/msg00092.html
+
+Bug-Description:
+
+Command substitutions need to preserve newlines instead of replacing them
+with semicolons, especially in the presence of multiple here-documents.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.2-patched/print_cmd.c	2022-07-26 09:16:39.000000000 -0400
+--- print_cmd.c	2022-10-17 10:41:06.000000000 -0400
+***************
+*** 298,305 ****
+--- 298,307 ----
+  	      {
+  		char c = command->value.Connection->connector;
++ 		int was_newline;
+  
+  		s[0] = printing_comsub ? c : ';';
+  		s[1] = '\0';
+  
++ 		was_newline = deferred_heredocs == 0 && was_heredoc == 0 && c == '\n';
+  		if (deferred_heredocs == 0)
+  		  {
+***************
+*** 315,318 ****
+--- 317,322 ----
+  		if (inside_function_def)
+  		  cprintf ("\n");
++ 		else if (printing_comsub && c == '\n' && was_newline == 0)
++ 		  cprintf ("\n");	/* preserve newlines in comsubs but don't double them */
+  		else
+  		  {
+***************
+*** 1366,1370 ****
+      }
+    else
+!     newline ("}");
+  
+    dispose_command (cmdcopy);
+--- 1371,1379 ----
+      }
+    else
+!     {
+!       /* { */
+!       newline ("}");
+!       was_heredoc = 0;		/* not printing any here-documents now */
+!     }
+  
+    dispose_command (cmdcopy);
+***************
+*** 1443,1447 ****
+      }
+    else
+!     newline ("}");
+  
+    result = the_printed_command;
+--- 1452,1459 ----
+      }
+    else
+!     {	/* { */
+!       newline ("}");
+!       was_heredoc = 0;
+!     }
+  
+    result = the_printed_command;
+*** ../bash-5.2/patchlevel.h	2020-06-22 14:51:03.000000000 -0400
+--- patchlevel.h	2020-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 2
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 3
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash52-004 b/src/patches/bash/bash52-004
new file mode 100644
index 000000000..d0834c19c
--- /dev/null
+++ b/src/patches/bash/bash52-004
@@ -0,0 +1,70 @@ 
+			     BASH PATCH REPORT
+			     =================
+
+Bash-Release:	5.2
+Patch-ID:	bash52-004
+
+Bug-Reported-by:	Antoine <bug-bash@glitchimini.net>
+Bug-Reference-ID:	<8bd59753-05ff-9b09-2337-2c7f52ded650@glitchimini.net>
+Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2022-10/msg00022.html
+
+Bug-Description:
+
+Bash needs to keep better track of nested brace expansions to avoid problems
+with quoting and POSIX semantics.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.2-patched/subst.c	2022-10-05 10:22:02.000000000 -0400
+--- subst.c	2022-10-06 15:19:08.000000000 -0400
+***************
+*** 1799,1802 ****
+--- 1804,1810 ----
+  }
+  
++ #define PARAMEXPNEST_MAX	32	// for now
++ static int dbstate[PARAMEXPNEST_MAX];
++ 
+  /* Extract a parameter expansion expression within ${ and } from STRING.
+     Obey the Posix.2 rules for finding the ending `}': count braces while
+***************
+*** 1829,1832 ****
+--- 1837,1842 ----
+      return (extract_heredoc_dolbrace_string (string, sindex, quoted, flags));
+  
++   dbstate[0] = dolbrace_state;
++ 
+    pass_character = 0;
+    nesting_level = 1;
+***************
+*** 1853,1856 ****
+--- 1863,1868 ----
+        if (string[i] == '$' && string[i+1] == LBRACE)
+  	{
++ 	  if (nesting_level < PARAMEXPNEST_MAX)
++ 	    dbstate[nesting_level] = dolbrace_state;
+  	  nesting_level++;
+  	  i += 2;
+***************
+*** 1865,1868 ****
+--- 1877,1881 ----
+  	  if (nesting_level == 0)
+  	    break;
++ 	  dolbrace_state = (nesting_level < PARAMEXPNEST_MAX) ? dbstate[nesting_level] : dbstate[0];	/* Guess using initial state */
+  	  i++;
+  	  continue;
+*** ../bash-5.2/patchlevel.h	2020-06-22 14:51:03.000000000 -0400
+--- patchlevel.h	2020-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 3
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 4
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash52-005 b/src/patches/bash/bash52-005
new file mode 100644
index 000000000..3f6a85215
--- /dev/null
+++ b/src/patches/bash/bash52-005
@@ -0,0 +1,47 @@ 
+			     BASH PATCH REPORT
+			     =================
+
+Bash-Release:	5.2
+Patch-ID:	bash52-005
+
+Bug-Reported-by:	Justin Wood (Callek) <callek@gmail.com>
+Bug-Reference-ID:	<CANBDKY9fp2yiXONP7RY4kNuRteuovUebxSJaqePHeu7cyaFS9Q@mail.gmail.com>
+Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2022-10/msg00088.html
+
+Bug-Description:
+
+Null pattern substitution replacement strings can cause a crash.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.2-patched/subst.c	2022-10-05 10:22:02.000000000 -0400
+--- subst.c	2022-10-13 16:57:26.000000000 -0400
+***************
+*** 8966,8970 ****
+      }
+    else if (*string == 0 && (match_pattern (string, pat, mtype, &s, &e) != 0))
+!     return ((mflags & MATCH_EXPREP) ? strcreplace (rep, '&', "", 2) : savestring (rep));
+  
+    ret = (char *)xmalloc (rsize = 64);
+--- 8966,8971 ----
+      }
+    else if (*string == 0 && (match_pattern (string, pat, mtype, &s, &e) != 0))
+!     return (mflags & MATCH_EXPREP) ? strcreplace (rep, '&', "", 2)
+! 				   : (rep ? savestring (rep) : savestring (""));
+  
+    ret = (char *)xmalloc (rsize = 64);
+*** ../bash-5.2/patchlevel.h	2020-06-22 14:51:03.000000000 -0400
+--- patchlevel.h	2020-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 4
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 5
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash52-006 b/src/patches/bash/bash52-006
new file mode 100644
index 000000000..851cfd7b6
--- /dev/null
+++ b/src/patches/bash/bash52-006
@@ -0,0 +1,293 @@ 
+			     BASH PATCH REPORT
+			     =================
+
+Bash-Release:	5.2
+Patch-ID:	bash52-006
+
+Bug-Reported-by:	feng xiangjun <fengxj325@gmail.com>
+Bug-Reference-ID:	<CAHH2t87LrCmO=gdyWOmGn5WJt7EucL+iOXzrry34OETe50S6uA@mail.gmail.com>
+Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2022-10/msg00089.html
+
+Bug-Description:
+
+In interactive shells, interrupting the shell while entering a command
+substitution can inhibit alias expansion.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.2-patched/parse.y	2022-10-08 13:10:06.000000000 -0400
+--- parse.y	2022-10-14 10:03:19.000000000 -0400
+***************
+*** 3307,3310 ****
+--- 3307,3312 ----
+      extended_glob = global_extglob;
+  #endif
++   if (parser_state & (PST_CMDSUBST|PST_STRING))
++     expand_aliases = expaliases_flag;
+  
+    parser_state = 0;
+***************
+*** 4389,4392 ****
+--- 4391,4395 ----
+      parser_state |= PST_NOERROR;
+  
++   parser_state |= PST_STRING;
+    expand_aliases = 0;
+  
+***************
+*** 6402,6406 ****
+        parser_state &= ~PST_NOEXPAND;	/* parse_comsub sentinel */
+        /* State flags we want to set for this run through the tokenizer. */
+!       parser_state |= PST_COMPASSIGN|PST_REPARSE;
+      }
+  
+--- 6405,6409 ----
+        parser_state &= ~PST_NOEXPAND;	/* parse_comsub sentinel */
+        /* State flags we want to set for this run through the tokenizer. */
+!       parser_state |= PST_COMPASSIGN|PST_REPARSE|PST_STRING;
+      }
+  
+*** ../bash-20221007/parser.h	2022-08-30 11:39:56.000000000 -0400
+--- parser.h	2022-10-14 09:56:18.000000000 -0400
+***************
+*** 51,54 ****
+--- 51,55 ----
+  #define PST_NOEXPAND	0x400000	/* don't expand anything in read_token_word; for command substitution */
+  #define PST_NOERROR	0x800000	/* don't print error messages in yyerror */
++ #define PST_STRING	0x1000000	/* parsing a string to a command or word list */
+  
+  /* Definition of the delimiter stack.  Needed by parse.y and bashhist.c. */
+*** ../bash-20221007/builtins/shopt.def	2022-10-07 10:25:55.000000000 -0400
+--- builtins/shopt.def	2022-10-14 09:30:11.000000000 -0400
+***************
+*** 150,153 ****
+--- 150,156 ----
+  #endif
+  
++ int expaliases_flag = 0;
++ static int shopt_set_expaliases PARAMS((char *, int));
++ 
+  static int shopt_set_debug_mode PARAMS((char *, int));
+  
+***************
+*** 199,203 ****
+    { "dotglob", &glob_dot_filenames, (shopt_set_func_t *)NULL },
+    { "execfail", &no_exit_on_failed_exec, (shopt_set_func_t *)NULL },
+!   { "expand_aliases", &expand_aliases, (shopt_set_func_t *)NULL },
+  #if defined (DEBUGGER)
+    { "extdebug", &debugging_mode, shopt_set_debug_mode },
+--- 202,206 ----
+    { "dotglob", &glob_dot_filenames, (shopt_set_func_t *)NULL },
+    { "execfail", &no_exit_on_failed_exec, (shopt_set_func_t *)NULL },
+!   { "expand_aliases", &expaliases_flag, shopt_set_expaliases },
+  #if defined (DEBUGGER)
+    { "extdebug", &debugging_mode, shopt_set_debug_mode },
+***************
+*** 351,355 ****
+    allow_null_glob_expansion = glob_dot_filenames = 0;
+    no_exit_on_failed_exec = 0;
+!   expand_aliases = 0;
+    extended_quote = 1;
+    fail_glob_expansion = 0;
+--- 354,358 ----
+    allow_null_glob_expansion = glob_dot_filenames = 0;
+    no_exit_on_failed_exec = 0;
+!   expand_aliases = expaliases_flag = 0;
+    extended_quote = 1;
+    fail_glob_expansion = 0;
+***************
+*** 632,635 ****
+--- 635,647 ----
+  }
+  
++ static int
++ shopt_set_expaliases (option_name, mode)
++      char *option_name;
++      int mode;
++ {
++   expand_aliases = expaliases_flag;
++   return 0;
++ }
++ 
+  #if defined (READLINE)
+  static int
+*** ../bash-20221007/builtins/common.h	2022-10-07 10:10:17.000000000 -0400
+--- builtins/common.h	2022-10-14 09:29:25.000000000 -0400
+***************
+*** 258,261 ****
+--- 258,263 ----
+  #endif
+  
++ extern int expaliases_flag;
++ 
+  /* variables from source.def */
+  extern int source_searches_cwd;
+*** ../bash-20221007/execute_cmd.c	2022-10-10 10:48:54.000000000 -0400
+--- execute_cmd.c	2022-10-14 09:32:24.000000000 -0400
+***************
+*** 1537,1541 ****
+  	 aliases. */
+        if (ois != interactive_shell)
+! 	expand_aliases = 0;
+      }
+  
+--- 1537,1541 ----
+  	 aliases. */
+        if (ois != interactive_shell)
+! 	expand_aliases = expaliases_flag = 0;
+      }
+  
+*** ../bash-20221007/general.c	2021-11-04 14:12:38.000000000 -0400
+--- general.c	2022-10-14 09:34:24.000000000 -0400
+***************
+*** 92,96 ****
+    &interactive_comments,
+    &source_uses_path,
+!   &expand_aliases,
+    &inherit_errexit,
+    &print_shift_error,
+--- 92,96 ----
+    &interactive_comments,
+    &source_uses_path,
+!   &expaliases_flag,
+    &inherit_errexit,
+    &print_shift_error,
+***************
+*** 107,111 ****
+    if (on != 0)
+      {
+!       interactive_comments = source_uses_path = expand_aliases = 1;
+        inherit_errexit = 1;
+        source_searches_cwd = 0;
+--- 107,112 ----
+    if (on != 0)
+      {
+!       interactive_comments = source_uses_path = 1;
+!       expand_aliases = expaliases_flag = 1;
+        inherit_errexit = 1;
+        source_searches_cwd = 0;
+***************
+*** 117,120 ****
+--- 118,122 ----
+      {
+        set_posix_options (saved_posix_vars);
++       expand_aliases = expaliases_flag;
+        free (saved_posix_vars);
+        saved_posix_vars = 0;
+***************
+*** 123,127 ****
+      {
+        source_searches_cwd = 1;
+!       expand_aliases = interactive_shell;
+        print_shift_error = 0;
+      }
+--- 125,129 ----
+      {
+        source_searches_cwd = 1;
+!       expand_aliases = expaliases_flag = interactive_shell;	/* XXX */
+        print_shift_error = 0;
+      }
+
+*** ../bash-5.2-patched/shell.c	2022-03-04 15:13:00.000000000 -0500
+--- shell.c	2022-10-14 09:36:19.000000000 -0400
+***************
+*** 1845,1850 ****
+  init_interactive ()
+  {
+!   expand_aliases = interactive_shell = startup_state = 1;
+!   interactive = 1;
+  #if defined (HISTORY)
+    if (enable_history_list == -1)
+--- 1845,1850 ----
+  init_interactive ()
+  {
+!   expand_aliases = expaliases_flag = 1;
+!   interactive_shell = startup_state = interactive = 1;
+  #if defined (HISTORY)
+    if (enable_history_list == -1)
+***************
+*** 1866,1870 ****
+  #endif /* HISTORY */
+    interactive_shell = startup_state = interactive = 0;
+!   expand_aliases = posixly_correct;	/* XXX - was 0 not posixly_correct */
+    no_line_editing = 1;
+  #if defined (JOB_CONTROL)
+--- 1866,1870 ----
+  #endif /* HISTORY */
+    interactive_shell = startup_state = interactive = 0;
+!   expand_aliases = expaliases_flag = posixly_correct;	/* XXX - was 0 not posixly_correct */
+    no_line_editing = 1;
+  #if defined (JOB_CONTROL)
+***************
+*** 1883,1887 ****
+  #endif
+    init_noninteractive ();
+!   expand_aliases = interactive_shell = startup_state = 1;
+  #if defined (HISTORY)
+    remember_on_history = enable_history_list;	/* XXX */
+--- 1883,1887 ----
+  #endif
+    init_noninteractive ();
+!   expand_aliases = expaliases_flag = interactive_shell = startup_state = 1;
+  #if defined (HISTORY)
+    remember_on_history = enable_history_list;	/* XXX */
+***************
+*** 2026,2030 ****
+    forced_interactive = interactive_shell = 0;
+    subshell_environment = running_in_background = 0;
+!   expand_aliases = 0;
+    bash_argv_initialized = 0;
+  
+--- 2026,2030 ----
+    forced_interactive = interactive_shell = 0;
+    subshell_environment = running_in_background = 0;
+!   expand_aliases = expaliases_flag = 0;
+    bash_argv_initialized = 0;
+  
+*** ../bash-5.2-patched/y.tab.c	2022-09-23 10:18:27.000000000 -0400
+--- y.tab.c	2022-10-14 14:57:26.000000000 -0400
+***************
+*** 5618,5621 ****
+--- 5618,5623 ----
+      extended_glob = global_extglob;
+  #endif
++   if (parser_state & (PST_CMDSUBST|PST_STRING))
++     expand_aliases = expaliases_flag;
+  
+    parser_state = 0;
+***************
+*** 6700,6703 ****
+--- 6702,6706 ----
+      parser_state |= PST_NOERROR;
+  
++   parser_state |= PST_STRING;
+    expand_aliases = 0;
+  
+***************
+*** 8713,8717 ****
+        parser_state &= ~PST_NOEXPAND;	/* parse_comsub sentinel */
+        /* State flags we want to set for this run through the tokenizer. */
+!       parser_state |= PST_COMPASSIGN|PST_REPARSE;
+      }
+  
+--- 8716,8720 ----
+        parser_state &= ~PST_NOEXPAND;	/* parse_comsub sentinel */
+        /* State flags we want to set for this run through the tokenizer. */
+!       parser_state |= PST_COMPASSIGN|PST_REPARSE|PST_STRING;
+      }
+  
+*** ../bash-5.2/patchlevel.h	2020-06-22 14:51:03.000000000 -0400
+--- patchlevel.h	2020-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 5
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 6
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash52-007 b/src/patches/bash/bash52-007
new file mode 100644
index 000000000..152776f4b
--- /dev/null
+++ b/src/patches/bash/bash52-007
@@ -0,0 +1,262 @@ 
+			     BASH PATCH REPORT
+			     =================
+
+Bash-Release:	5.2
+Patch-ID:	bash52-007
+
+Bug-Reported-by:	Bruce Jerrick
+Bug-Reference-ID:
+Bug-Reference-URL:	https://bugzilla.redhat.com/show_bug.cgi?id=2134307
+
+Bug-Description:
+
+This patch fixes several problems with alias expansion inside command
+substitutions when in POSIX mode.
+
+Patch (apply with `patch -p0'):
+
+*** /fs1/chet/scratch/bash-5.2.6/parse.y	2022-11-02 10:36:54.000000000 -0400
+--- parse.y	2022-10-24 10:53:26.000000000 -0400
+***************
+*** 3613,3616 ****
+--- 3614,3618 ----
+  #define P_ARRAYSUB	0x0020	/* parsing a [...] array subscript for assignment */
+  #define P_DOLBRACE	0x0040	/* parsing a ${...} construct */
++ #define P_ARITH		0x0080	/* parsing a $(( )) arithmetic expansion */
+  
+  /* Lexical state while parsing a grouping construct or $(...). */
+***************
+*** 3911,3914 ****
+--- 3914,3920 ----
+  	  else if ((flags & (P_ARRAYSUB|P_DOLBRACE)) && (tflags & LEX_WASDOL) && (ch == '(' || ch == '{' || ch == '['))	/* ) } ] */
+  	    goto parse_dollar_word;
++ 	  else if ((flags & P_ARITH) && (tflags & LEX_WASDOL) && ch == '(') /*)*/
++ 	    /* $() inside $(( ))/$[ ] */
++ 	    goto parse_dollar_word;
+  #if defined (PROCESS_SUBSTITUTION)
+  	  /* XXX - technically this should only be recognized at the start of
+***************
+*** 3941,3945 ****
+  	    nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|P_DOLBRACE|rflags);
+  	  else if (ch == '[')		/* ] */
+! 	    nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags);
+  
+  	  CHECK_NESTRET_ERROR ();
+--- 3947,3951 ----
+  	    nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|P_DOLBRACE|rflags);
+  	  else if (ch == '[')		/* ] */
+! 	    nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags|P_ARITH);
+  
+  	  CHECK_NESTRET_ERROR ();
+***************
+*** 4080,4084 ****
+        shell_ungetc (peekc);
+        if (peekc == '(')		/*)*/
+! 	return (parse_matched_pair (qc, open, close, lenp, 0));
+      }
+  
+--- 4086,4090 ----
+        shell_ungetc (peekc);
+        if (peekc == '(')		/*)*/
+! 	return (parse_matched_pair (qc, open, close, lenp, P_ARITH));
+      }
+  
+***************
+*** 4501,4505 ****
+  
+    exp_lineno = line_number;
+!   ttok = parse_matched_pair (0, '(', ')', &ttoklen, 0);
+    rval = 1;
+    if (ttok == &matched_pair_error)
+--- 4512,4516 ----
+  
+    exp_lineno = line_number;
+!   ttok = parse_matched_pair (0, '(', ')', &ttoklen, P_ARITH);
+    rval = 1;
+    if (ttok == &matched_pair_error)
+***************
+*** 5016,5020 ****
+  		}
+  	      else
+! 		ttok = parse_matched_pair (cd, '[', ']', &ttoklen, 0);
+  	      if (ttok == &matched_pair_error)
+  		return -1;		/* Bail immediately. */
+--- 5030,5034 ----
+  		}
+  	      else
+! 		ttok = parse_matched_pair (cd, '[', ']', &ttoklen, P_ARITH);
+  	      if (ttok == &matched_pair_error)
+  		return -1;		/* Bail immediately. */
+*** ../bash-5.2.6/y.tab.c	2022-11-02 10:36:54.000000000 -0400
+--- y.tab.c	2022-11-02 10:55:58.000000000 -0400
+***************
+*** 5924,5927 ****
+--- 5924,5928 ----
+  #define P_ARRAYSUB	0x0020	/* parsing a [...] array subscript for assignment */
+  #define P_DOLBRACE	0x0040	/* parsing a ${...} construct */
++ #define P_ARITH		0x0080	/* parsing a $(( )) arithmetic expansion */
+  
+  /* Lexical state while parsing a grouping construct or $(...). */
+***************
+*** 6222,6225 ****
+--- 6223,6229 ----
+  	  else if ((flags & (P_ARRAYSUB|P_DOLBRACE)) && (tflags & LEX_WASDOL) && (ch == '(' || ch == '{' || ch == '['))	/* ) } ] */
+  	    goto parse_dollar_word;
++ 	  else if ((flags & P_ARITH) && (tflags & LEX_WASDOL) && ch == '(') /*)*/
++ 	    /* $() inside $(( ))/$[ ] */
++ 	    goto parse_dollar_word;
+  #if defined (PROCESS_SUBSTITUTION)
+  	  /* XXX - technically this should only be recognized at the start of
+***************
+*** 6252,6256 ****
+  	    nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|P_DOLBRACE|rflags);
+  	  else if (ch == '[')		/* ] */
+! 	    nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags);
+  
+  	  CHECK_NESTRET_ERROR ();
+--- 6256,6260 ----
+  	    nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|P_DOLBRACE|rflags);
+  	  else if (ch == '[')		/* ] */
+! 	    nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags|P_ARITH);
+  
+  	  CHECK_NESTRET_ERROR ();
+***************
+*** 6391,6395 ****
+        shell_ungetc (peekc);
+        if (peekc == '(')		/*)*/
+! 	return (parse_matched_pair (qc, open, close, lenp, 0));
+      }
+  
+--- 6395,6399 ----
+        shell_ungetc (peekc);
+        if (peekc == '(')		/*)*/
+! 	return (parse_matched_pair (qc, open, close, lenp, P_ARITH));
+      }
+  
+***************
+*** 6812,6816 ****
+  
+    exp_lineno = line_number;
+!   ttok = parse_matched_pair (0, '(', ')', &ttoklen, 0);
+    rval = 1;
+    if (ttok == &matched_pair_error)
+--- 6816,6820 ----
+  
+    exp_lineno = line_number;
+!   ttok = parse_matched_pair (0, '(', ')', &ttoklen, P_ARITH);
+    rval = 1;
+    if (ttok == &matched_pair_error)
+***************
+*** 7327,7331 ****
+  		}
+  	      else
+! 		ttok = parse_matched_pair (cd, '[', ']', &ttoklen, 0);
+  	      if (ttok == &matched_pair_error)
+  		return -1;		/* Bail immediately. */
+--- 7331,7335 ----
+  		}
+  	      else
+! 		ttok = parse_matched_pair (cd, '[', ']', &ttoklen, P_ARITH);
+  	      if (ttok == &matched_pair_error)
+  		return -1;		/* Bail immediately. */
+*** /fs1/chet/scratch/bash-5.2.6/builtins/evalstring.c	2022-07-18 14:46:56.000000000 -0400
+--- builtins/evalstring.c	2022-10-18 10:57:51.000000000 -0400
+***************
+*** 432,435 ****
+--- 432,437 ----
+        if (parse_command () == 0)
+  	{
++ 	  int local_expalias, local_alflag;
++ 
+  	  if ((flags & SEVAL_PARSEONLY) || (interactive_shell == 0 && read_but_dont_execute))
+  	    {
+***************
+*** 508,511 ****
+--- 510,526 ----
+  #endif /* ONESHOT */
+  
++ 	      /* We play tricks in the parser and command_substitute() turning
++ 		 expand_aliases on and off depending on which parsing pass and
++ 		 whether or not we're in posix mode. This only matters for
++ 		 parsing, and we let the higher layers deal with that. We just
++ 		 want to ensure that expand_aliases is set to the appropriate
++ 		 global value when we go to execute this command, so we save
++ 		 and restore it around the execution (we don't restore it if
++ 		 the global value of the flag (expaliases_flag) changes). */
++ 	      local_expalias = expand_aliases;
++ 	      local_alflag = expaliases_flag;
++ 	      if (subshell_environment & SUBSHELL_COMSUB)
++ 		expand_aliases = expaliases_flag;
++ 
+  	      /* See if this is a candidate for $( <file ). */
+  	      if (startup_state == 2 &&
+***************
+*** 525,528 ****
+--- 540,547 ----
+  	      discard_unwind_frame ("pe_dispose");
+  
++ 	      /* If the global value didn't change, we restore what we had. */
++ 	      if ((subshell_environment & SUBSHELL_COMSUB) && local_alflag == expaliases_flag)
++ 		expand_aliases = local_expalias;
++ 
+  	      if (flags & SEVAL_ONECMD)
+  		{
+*** /fs1/chet/scratch/bash-5.2.6/command.h	2021-04-30 15:43:15.000000000 -0400
+--- command.h	2022-10-18 11:44:31.000000000 -0400
+***************
+*** 115,118 ****
+--- 115,119 ----
+  #define PF_EXPANDRHS	0x20	/* same as W_EXPANDRHS */
+  #define PF_ALLINDS	0x40	/* array, act as if [@] was supplied */
++ #define PF_BACKQUOTE	0x80	/* differentiate `` from $() for command_substitute */
+  
+  /* Possible values for subshell_environment */
+*** /fs1/chet/scratch/bash-5.2.6/subst.c	2022-11-02 10:28:10.000000000 -0400
+--- subst.c	2022-10-20 12:41:07.000000000 -0400
+***************
+*** 7124,7129 ****
+  
+        /* We want to expand aliases on this pass if we are not in posix mode
+! 	 for backwards compatibility. */
+!       if (expand_aliases)
+          expand_aliases = posixly_correct == 0;
+  
+--- 7133,7142 ----
+  
+        /* We want to expand aliases on this pass if we are not in posix mode
+! 	 for backwards compatibility. parse_and_execute() takes care of
+! 	 setting expand_aliases back to the global value when executing the
+! 	 parsed string. We only do this for $(...) command substitution,
+! 	 since that is what parse_comsub handles; `` comsubs are processed
+! 	 using parse.y:parse_matched_pair(). */
+!       if (expand_aliases && (flags & PF_BACKQUOTE) == 0)
+          expand_aliases = posixly_correct == 0;
+  
+***************
+*** 11293,11297 ****
+  	      {
+  		de_backslash (temp);
+! 		tword = command_substitute (temp, quoted, 0);
+  		temp1 = tword ? tword->word : (char *)NULL;
+  		if (tword)
+--- 11306,11310 ----
+  	      {
+  		de_backslash (temp);
+! 		tword = command_substitute (temp, quoted, PF_BACKQUOTE);
+  		temp1 = tword ? tword->word : (char *)NULL;
+  		if (tword)
+*** ../bash-5.2/patchlevel.h	2020-06-22 14:51:03.000000000 -0400
+--- patchlevel.h	2020-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 6
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 7
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash52-008 b/src/patches/bash/bash52-008
new file mode 100644
index 000000000..ff6371140
--- /dev/null
+++ b/src/patches/bash/bash52-008
@@ -0,0 +1,58 @@ 
+			     BASH PATCH REPORT
+			     =================
+
+Bash-Release:	5.2
+Patch-ID:	bash52-008
+
+Bug-Reported-by:	Glenn Jackman <glenn.jackman@gmail.com>
+Bug-Reference-ID:	<CAFC8ewQDx7hzNJzveuJ5o4FWo=ij7MzckiJVN_6NXjp504QZeg@mail.gmail.com>
+Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2022-10/msg00095.html
+
+Bug-Description:
+
+Array subscript expansion can inappropriately quote brackets if the expression
+contains < or >.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-20221015/subst.c	2022-10-18 10:47:33.000000000 -0500
+--- subst.c	2022-10-20 11:41:07.000000000 -0500
+***************
+*** 3820,3823 ****
+--- 3820,3827 ----
+  #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 == '~')
++ 
+  /* If there are any characters in STRING that require full expansion,
+     then call FUNC to expand STRING; otherwise just perform quote
+***************
+*** 4029,4033 ****
+    while (string[i])
+      {
+!       if (EXP_CHAR (string[i]))
+  	break;
+        else if (string[i] == '\'' || string[i] == '\\' || string[i] == '"')
+--- 4033,4037 ----
+    while (string[i])
+      {
+!       if (ARITH_EXP_CHAR (string[i]))
+  	break;
+        else if (string[i] == '\'' || string[i] == '\\' || string[i] == '"')
+*** ../bash-5.2/patchlevel.h	2020-06-22 14:51:03.000000000 -0400
+--- patchlevel.h	2020-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 7
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 8
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash52-009 b/src/patches/bash/bash52-009
new file mode 100644
index 000000000..f907c8c47
--- /dev/null
+++ b/src/patches/bash/bash52-009
@@ -0,0 +1,43 @@ 
+			     BASH PATCH REPORT
+			     =================
+
+Bash-Release:	5.2
+Patch-ID:	bash52-009
+
+Bug-Reported-by:	Corey Hickey <bugfood-ml@fatooh.org>
+Bug-Reference-ID:	<134330ef-0ead-d73e-68eb-d58fc51efdba@fatooh.org>
+Bug-Reference-URL:	https://lists.gnu.org/archive/html/help-bash/2022-10/msg00025.html
+
+Bug-Description:
+
+Bash arithmetic expansion should allow `@' and `*' to be used as associative
+array keys in expressions.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.2-patched/expr.c	2022-07-11 10:03:34.000000000 -0400
+--- expr.c	2022-10-31 10:51:08.000000000 -0400
+***************
+*** 1169,1172 ****
+--- 1169,1174 ----
+  #if defined (ARRAY_VARS)
+    aflag = tflag;	/* use a different variable for now */
++   if (shell_compatibility_level > 51)
++     aflag |= AV_ATSTARKEYS;
+    v = (e == ']') ? array_variable_part (tok, tflag, (char **)0, (int *)0) : find_variable (tok);
+  #else
+*** ../bash-5.2/patchlevel.h	2020-06-22 14:51:03.000000000 -0400
+--- patchlevel.h	2020-10-01 11:01:28.000000000 -0400
+***************
+*** 26,30 ****
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 8
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 9
+  
+  #endif /* _PATCHLEVEL_H_ */