bash: Update to version 5.1.8 plus patches 9 to 12

Message ID 20211206210635.858730-1-adolf.belka@ipfire.org
State Accepted
Commit 725ffd6f03ff6c454170b982025a66fc10dcdcb4
Headers
Series bash: Update to version 5.1.8 plus patches 9 to 12 |

Commit Message

Adolf Belka Dec. 6, 2021, 9:06 p.m. UTC
  - Update main file from 5.1 to 5.1.8 (includes patches 1 to 8)
- Remove patches 1 to 4
- Changelog - Patches 1 to 4 from the previous IPFire version together with patches 5 to
     8 are now included into bash-5.1.8 followed by application of patches 9 to 12
   Patch 12
    There is a possible race condition that arises when a child process receives
     a signal trapped by the parent before it can reset the signal dispositions.
     The child process is not supposed to trap the signal in this circumstance.
   Patch 11
    When reading a compound assignment, and running it through the parser to
     split it into words, we need to save and restore any alias we're currently
     expanding.
   Patch 10
    If `wait -n' is interrupted by a trapped signal other than SIGINT, it does
     not completely clean up state, and that can prevent subsequent calls to
     `wait -n' from working correctly.
   Patch 9
    The bash malloc implementation of malloc_usable_size() does not follow the
     specification. This can cause library functions that use it to overwrite
     memory bounds checking.
   Patch 8
    Process substitution FIFOs opened by child processes as targets of redirections
     were not removed appropriately, leaving remnants in the file system.
   Patch 7
    The code to check readline versions in an inputrc file had the sense of the
     comparisons reversed.
   Patch 6
    Make sure child processes forked to run command substitutions are in the
     proper process group.
   Patch 5
    Fix two memory leaks when assigning arrays using compound assignment syntax.

Signed-off-by: Adolf Belka <adolf.belka@ipfire.org>
---
 lfs/bash                    |   6 +-
 src/patches/bash/bash51-001 |  80 ---------------
 src/patches/bash/bash51-002 |  57 -----------
 src/patches/bash/bash51-003 |  53 ----------
 src/patches/bash/bash51-004 | 126 -----------------------
 src/patches/bash/bash51-009 |  59 +++++++++++
 src/patches/bash/bash51-010 |  59 +++++++++++
 src/patches/bash/bash51-011 |  81 +++++++++++++++
 src/patches/bash/bash51-012 | 198 ++++++++++++++++++++++++++++++++++++
 9 files changed, 400 insertions(+), 319 deletions(-)
 delete mode 100644 src/patches/bash/bash51-001
 delete mode 100644 src/patches/bash/bash51-002
 delete mode 100644 src/patches/bash/bash51-003
 delete mode 100644 src/patches/bash/bash51-004
 create mode 100644 src/patches/bash/bash51-009
 create mode 100644 src/patches/bash/bash51-010
 create mode 100644 src/patches/bash/bash51-011
 create mode 100644 src/patches/bash/bash51-012
  

Comments

Michael Tremer Dec. 7, 2021, 11:17 a.m. UTC | #1
Hello,

Thank you for this patch.

Isn’t it a bit odd that upstream released a tarball for 5.1.8 but not for .12?

Isn’t it easier to just import the patches and stick with the original 5.1 tarball?

It will all result in the same piece of software. I am just curious.

-Michael

> On 6 Dec 2021, at 21:06, Adolf Belka <adolf.belka@ipfire.org> wrote:
> 
> - Update main file from 5.1 to 5.1.8 (includes patches 1 to 8)
> - Remove patches 1 to 4
> - Changelog - Patches 1 to 4 from the previous IPFire version together with patches 5 to
>     8 are now included into bash-5.1.8 followed by application of patches 9 to 12
>   Patch 12
>    There is a possible race condition that arises when a child process receives
>     a signal trapped by the parent before it can reset the signal dispositions.
>     The child process is not supposed to trap the signal in this circumstance.
>   Patch 11
>    When reading a compound assignment, and running it through the parser to
>     split it into words, we need to save and restore any alias we're currently
>     expanding.
>   Patch 10
>    If `wait -n' is interrupted by a trapped signal other than SIGINT, it does
>     not completely clean up state, and that can prevent subsequent calls to
>     `wait -n' from working correctly.
>   Patch 9
>    The bash malloc implementation of malloc_usable_size() does not follow the
>     specification. This can cause library functions that use it to overwrite
>     memory bounds checking.
>   Patch 8
>    Process substitution FIFOs opened by child processes as targets of redirections
>     were not removed appropriately, leaving remnants in the file system.
>   Patch 7
>    The code to check readline versions in an inputrc file had the sense of the
>     comparisons reversed.
>   Patch 6
>    Make sure child processes forked to run command substitutions are in the
>     proper process group.
>   Patch 5
>    Fix two memory leaks when assigning arrays using compound assignment syntax.
> 
> Signed-off-by: Adolf Belka <adolf.belka@ipfire.org>
> ---
> lfs/bash                    |   6 +-
> src/patches/bash/bash51-001 |  80 ---------------
> src/patches/bash/bash51-002 |  57 -----------
> src/patches/bash/bash51-003 |  53 ----------
> src/patches/bash/bash51-004 | 126 -----------------------
> src/patches/bash/bash51-009 |  59 +++++++++++
> src/patches/bash/bash51-010 |  59 +++++++++++
> src/patches/bash/bash51-011 |  81 +++++++++++++++
> src/patches/bash/bash51-012 | 198 ++++++++++++++++++++++++++++++++++++
> 9 files changed, 400 insertions(+), 319 deletions(-)
> delete mode 100644 src/patches/bash/bash51-001
> delete mode 100644 src/patches/bash/bash51-002
> delete mode 100644 src/patches/bash/bash51-003
> delete mode 100644 src/patches/bash/bash51-004
> create mode 100644 src/patches/bash/bash51-009
> create mode 100644 src/patches/bash/bash51-010
> create mode 100644 src/patches/bash/bash51-011
> create mode 100644 src/patches/bash/bash51-012
> 
> diff --git a/lfs/bash b/lfs/bash
> index 7b0baccad..1bf3eb2ec 100644
> --- a/lfs/bash
> +++ b/lfs/bash
> @@ -24,7 +24,7 @@
> 
> include Config
> 
> -VER        = 5.1
> +VER        = 5.1.8
> 
> THISAPP    = bash-$(VER)
> DL_FILE    = $(THISAPP).tar.gz
> @@ -53,7 +53,7 @@ objects = $(DL_FILE)
> 
> $(DL_FILE)             = $(DL_FROM)/$(DL_FILE)
> 
> -$(DL_FILE)_MD5         = bb91a17fd6c9032c26d0b2b78b50aff5
> +$(DL_FILE)_MD5         = 23eee6195b47318b9fd878e590ccb38c
> 
> install : $(TARGET)
> 
> @@ -87,7 +87,7 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
> 	sed -e "s/filename, RTLD_LAZY/filename, RTLD_NOW/" \
> 		-i $(DIR_APP)/builtins/enable.def
> 
> -	for i in $$(seq 1 4); do \
> +	for i in $$(seq 9 12); do \
> 		cd $(DIR_APP) && patch -Np0 < $(DIR_SRC)/src/patches/bash/bash51-$$(printf "%03d" "$${i}") || exit 1; \
> 	done
> 
> diff --git a/src/patches/bash/bash51-001 b/src/patches/bash/bash51-001
> deleted file mode 100644
> index 6f29981d2..000000000
> --- a/src/patches/bash/bash51-001
> +++ /dev/null
> @@ -1,80 +0,0 @@
> -			     BASH PATCH REPORT
> -			     =================
> -
> -Bash-Release:	5.1
> -Patch-ID:	bash51-001
> -
> -Bug-Reported-by:	Fazal Majid <fazal@majid.org>
> -Bug-Reference-ID:	<DEAB7D2C-C626-450C-B2E5-281AFF2D26D4@majid.org>
> -Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-12/msg00000.html
> -
> -Bug-Description:
> -
> -There is a missing dependency on a constructed file, which can cause highly
> -parellel builds to fail.
> -
> -Patch (apply with `patch -p0'):
> -
> -*** ../bash-5.1-patched/Makefile.in	2020-12-04 09:51:19.000000000 -0500
> ---- Makefile.in	2020-12-16 11:28:36.000000000 -0500
> -***************
> -*** 1316,1319 ****
> ---- 1316,1320 ----
> -  bashline.o: pcomplete.h ${BASHINCDIR}/chartypes.h input.h
> -  bashline.o: ${BASHINCDIR}/shmbutil.h ${BASHINCDIR}/shmbchar.h
> -+ bashline.o: ${DEFDIR}/builtext.h
> -  bracecomp.o: config.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h
> -  bracecomp.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h
> -***************
> -*** 1436,1439 ****
> ---- 1437,1441 ----
> -  builtins/evalstring.o: jobs.h builtins.h flags.h input.h execute_cmd.h
> -  builtins/evalstring.o: bashhist.h $(DEFSRC)/common.h pathnames.h
> -+ builtins/evalstring.o: ${DEFDIR}/builtext.h
> -  builtins/getopt.o: config.h ${BASHINCDIR}/memalloc.h
> -  builtins/getopt.o: shell.h syntax.h bashjmp.h command.h general.h xmalloc.h error.h
> -
> -*** ../bash-5.1-patched/builtins/Makefile.in	2019-07-25 08:03:45.000000000 -0400
> ---- builtins/Makefile.in	2020-12-16 11:29:29.000000000 -0500
> -***************
> -*** 362,366 ****
> -  evalstring.o: $(topdir)/flags.h $(topdir)/input.h $(topdir)/execute_cmd.h
> -  evalstring.o: $(topdir)/bashhist.h $(srcdir)/common.h
> -! evalstring.o: $(topdir)/trap.h $(topdir)/redir.h ../pathnames.h
> -  #evalstring.o: $(topdir)/y.tab.h
> -  getopt.o: ../config.h $(BASHINCDIR)/memalloc.h
> ---- 362,366 ----
> -  evalstring.o: $(topdir)/flags.h $(topdir)/input.h $(topdir)/execute_cmd.h
> -  evalstring.o: $(topdir)/bashhist.h $(srcdir)/common.h
> -! evalstring.o: $(topdir)/trap.h $(topdir)/redir.h ../pathnames.h ./builtext.h
> -  #evalstring.o: $(topdir)/y.tab.h
> -  getopt.o: ../config.h $(BASHINCDIR)/memalloc.h
> -
> -*** ../bash-5.1/patchlevel.h	2020-06-22 14:51:03.000000000 -0400
> ---- patchlevel.h	2020-10-01 11:01:28.000000000 -0400
> -***************
> -*** 1,5 ****
> -  /* patchlevel.h -- current bash patch level */
> -  
> -! /* Copyright (C) 2001-2016 Free Software Foundation, Inc.
> -  
> -     This file is part of GNU Bash, the Bourne Again SHell.
> ---- 1,5 ----
> -  /* patchlevel.h -- current bash patch level */
> -  
> -! /* Copyright (C) 2001-2020 Free Software Foundation, Inc.
> -  
> -     This file is part of GNU Bash, the Bourne Again SHell.
> -***************
> -*** 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/bash51-002 b/src/patches/bash/bash51-002
> deleted file mode 100644
> index 8c991649a..000000000
> --- a/src/patches/bash/bash51-002
> +++ /dev/null
> @@ -1,57 +0,0 @@
> -			     BASH PATCH REPORT
> -			     =================
> -
> -Bash-Release:	5.1
> -Patch-ID:	bash51-002
> -
> -Bug-Reported-by:	oguzismailuysal@gmail.com
> -Bug-Reference-ID:	<CAH7i3LoHFUa4aSF5-AD2r80HG-p-YzD_9ZxomarZkhP8NMq63g@mail.gmail.com>
> -Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-12/msg00037.html
> -
> -Bug-Description:
> -
> -If there are no jobs, and the `-n' and `-p' options are both supplied to
> -`wait', bash can assign a value to the variable name specified with `-p'
> -instead of leaving it unset.
> -
> -Patch (apply with `patch -p0'):
> -
> -*** ../bash-5.1-patched/builtins/wait.def	2020-04-09 15:13:57.000000000 -0400
> ---- builtins/wait.def	2020-12-11 09:46:49.000000000 -0500
> -***************
> -*** 214,222 ****
> -  
> -        status = wait_for_any_job (wflags, &pstat);
> --       if (status < 0)
> -- 	status = 127;
> -- 
> -        if (vname && status >= 0)
> -  	bind_var_to_int (vname, pstat.pid);
> -        if (list)
> -  	unset_waitlist ();
> ---- 214,222 ----
> -  
> -        status = wait_for_any_job (wflags, &pstat);
> -        if (vname && status >= 0)
> -  	bind_var_to_int (vname, pstat.pid);
> -+ 
> -+       if (status < 0)
> -+ 	status = 127;
> -        if (list)
> -  	unset_waitlist ();
> -
> -*** ../bash-5.1/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/bash51-003 b/src/patches/bash/bash51-003
> deleted file mode 100644
> index 68e5dce6a..000000000
> --- a/src/patches/bash/bash51-003
> +++ /dev/null
> @@ -1,53 +0,0 @@
> -			     BASH PATCH REPORT
> -			     =================
> -
> -Bash-Release:	5.1
> -Patch-ID:	bash51-003
> -
> -Bug-Reported-by:	oguzismailuysal@gmail.com
> -Bug-Reference-ID:	<CAH7i3LpG91BnNcDtaTUm2Ph7a+PnJkuh6nAc87cVL7_38tOaMQ@mail.gmail.com>
> -Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-12/msg00050.html
> -
> -Bug-Description:
> -
> -Bash does not put a command substitution process that is started to perform an
> -expansion in a child process into the right process group where it can receive
> -keyboard-generated signals.
> -
> -Patch (apply with `patch -p0'):
> -
> -*** ../bash-5.1-patched/subst.c	2020-11-16 10:33:15.000000000 -0500
> ---- subst.c	2020-12-12 13:50:11.000000000 -0500
> -***************
> -*** 6357,6362 ****
> -  #if defined (JOB_CONTROL)
> -    old_pipeline_pgrp = pipeline_pgrp;
> -!   /* Don't reset the pipeline pgrp if we're already a subshell in a pipeline. */
> -!   if ((subshell_environment & SUBSHELL_PIPE) == 0)
> -      pipeline_pgrp = shell_pgrp;
> -    cleanup_the_pipeline ();
> ---- 6357,6364 ----
> -  #if defined (JOB_CONTROL)
> -    old_pipeline_pgrp = pipeline_pgrp;
> -!   /* Don't reset the pipeline pgrp if we're already a subshell in a pipeline or
> -!      we've already forked to run a disk command (and are expanding redirections,
> -!      for example). */
> -!   if ((subshell_environment & (SUBSHELL_FORK|SUBSHELL_PIPE)) == 0)
> -      pipeline_pgrp = shell_pgrp;
> -    cleanup_the_pipeline ();
> -
> -*** ../bash-5.1/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/bash51-004 b/src/patches/bash/bash51-004
> deleted file mode 100644
> index 39a6c647f..000000000
> --- a/src/patches/bash/bash51-004
> +++ /dev/null
> @@ -1,126 +0,0 @@
> -			     BASH PATCH REPORT
> -			     =================
> -
> -Bash-Release:	5.1
> -Patch-ID:	bash51-004
> -
> -Bug-Reported-by:	oguzismailuysal@gmail.com
> -Bug-Reference-ID:	<CAH7i3LoHGmwaghDpCWRUfcY04gQmeDTH3RiG=bf2b=KbU=gyhw@mail.gmail.com>
> -Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-12/msg00039.html
> -
> -Bug-Description:
> -
> -If a key-value compound array assignment to an associative array is supplied
> -as an assignment statement argument to the `declare' command that declares the
> -array, the assignment doesn't perform the correct word expansions.
> -
> -This patch makes key-value assignment and subscript assignment perform the
> -same expansions when they're supplied as an argument to `declare'.
> -
> -Patch (apply with `patch -p0'):
> -
> -*** ../bash-5.1-patched/arrayfunc.c	2020-10-09 11:38:58.000000000 -0400
> ---- arrayfunc.c	2020-12-11 15:12:22.000000000 -0500
> -***************
> -*** 598,601 ****
> ---- 598,622 ----
> -      }
> -  }
> -+ 
> -+ /* Return non-zero if L appears to be a key-value pair associative array
> -+    compound assignment. */ 
> -+ int
> -+ kvpair_assignment_p (l)
> -+      WORD_LIST *l;
> -+ {
> -+   return (l && (l->word->flags & W_ASSIGNMENT) == 0 && l->word->word[0] != '[');	/*]*/
> -+ }
> -+ 
> -+ char *
> -+ expand_and_quote_kvpair_word (w)
> -+      char *w;
> -+ {
> -+   char *t, *r;
> -+ 
> -+   t = w ? expand_assignment_string_to_string (w, 0) : 0;
> -+   r = sh_single_quote (t ? t : "");
> -+   free (t);
> -+   return r;
> -+ }
> -  #endif
> -       
> -***************
> -*** 641,645 ****
> -  
> -  #if ASSOC_KVPAIR_ASSIGNMENT
> -!   if (assoc_p (var) && nlist && (nlist->word->flags & W_ASSIGNMENT) == 0 && nlist->word->word[0] != '[')	/*]*/
> -      {
> -        iflags = flags & ~ASS_APPEND;
> ---- 662,666 ----
> -  
> -  #if ASSOC_KVPAIR_ASSIGNMENT
> -!   if (assoc_p (var) && kvpair_assignment_p (nlist))
> -      {
> -        iflags = flags & ~ASS_APPEND;
> -*** ../bash-5.1-patched/arrayfunc.h	2020-04-29 17:24:15.000000000 -0400
> ---- arrayfunc.h	2020-12-11 14:23:50.000000000 -0500
> -***************
> -*** 68,71 ****
> ---- 68,74 ----
> -  extern void quote_compound_array_list PARAMS((WORD_LIST *, int));
> -  
> -+ extern int kvpair_assignment_p PARAMS((WORD_LIST *));
> -+ extern char *expand_and_quote_kvpair_word PARAMS((char *));
> -+ 
> -  extern int unbind_array_element PARAMS((SHELL_VAR *, char *, int));
> -  extern int skipsubscript PARAMS((const char *, int, int));
> -*** ../bash-5.1-patched/subst.c	2020-11-16 10:33:15.000000000 -0500
> ---- subst.c	2020-12-11 15:11:10.000000000 -0500
> -***************
> -*** 11605,11608 ****
> ---- 11605,11609 ----
> -    WORD_LIST *l, *nl;
> -    char *t;
> -+   int kvpair;
> -    
> -    if (flags == 0)
> -***************
> -*** 11619,11622 ****
> ---- 11620,11627 ----
> -        /* Associative array */
> -        l = parse_string_to_word_list (value, 1, "array assign");
> -+ #if ASSOC_KVPAIR_ASSIGNMENT
> -+       kvpair = kvpair_assignment_p (l);
> -+ #endif
> -+ 
> -        /* For associative arrays, with their arbitrary subscripts, we have to
> -  	 expand and quote in one step so we don't have to search for the
> -***************
> -*** 11624,11627 ****
> ---- 11629,11638 ----
> -        for (nl = l; nl; nl = nl->next)
> -  	{
> -+ #if ASSOC_KVPAIR_ASSIGNMENT
> -+ 	  if (kvpair)
> -+ 	    /* keys and values undergo the same set of expansions */
> -+ 	    t = expand_and_quote_kvpair_word (nl->word->word);
> -+ 	  else
> -+ #endif
> -  	  if ((nl->word->flags & W_ASSIGNMENT) == 0)
> -  	    t = sh_single_quote (nl->word->word ? nl->word->word : "");
> -
> -*** ../bash-5.1/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/bash51-009 b/src/patches/bash/bash51-009
> new file mode 100644
> index 000000000..2796c3b9b
> --- /dev/null
> +++ b/src/patches/bash/bash51-009
> @@ -0,0 +1,59 @@
> +			     BASH PATCH REPORT
> +			     =================
> +
> +Bash-Release:	5.1
> +Patch-ID:	bash51-009
> +
> +Bug-Reported-by:	Julien Moutinho <julm+bash@sourcephile.fr>
> +Bug-Reference-ID:	<20211004035906.5kiobuzkpeckmvwg@sourcephile.fr>
> +Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2021-10/msg00022.html
> +
> +Bug-Description:
> +
> +The bash malloc implementation of malloc_usable_size() does not follow the
> +specification. This can cause library functions that use it to overwrite
> +memory bounds checking.
> +
> +Patch (apply with `patch -p0'):
> +
> +*** ../bash-5.1-patched/lib/malloc/malloc.c	2020-07-08 10:19:30.000000000 -0400
> +--- lib/malloc/malloc.c	2021-10-05 16:10:55.000000000 -0400
> +***************
> +*** 1287,1297 ****
> +      }
> +  
> +!   /* XXX - should we return 0 if ISFREE? */
> +!   maxbytes = binsize(p->mh_index);
> +! 
> +!   /* So the usable size is the maximum number of bytes in the bin less the
> +!      malloc overhead */
> +!   maxbytes -= MOVERHEAD + MSLOP;
> +!   return (maxbytes);
> +  }
> +  
> +--- 1358,1367 ----
> +      }
> +  
> +!   /* return 0 if ISFREE */
> +!   if (p->mh_alloc == ISFREE)
> +!     return 0;
> +!   
> +!   /* Since we use bounds checking, the usable size is the last requested size. */
> +!   return (p->mh_nbytes);
> +  }
> +  
> +*** ../bash-5.1/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_ */
> diff --git a/src/patches/bash/bash51-010 b/src/patches/bash/bash51-010
> new file mode 100644
> index 000000000..cfe6fa46b
> --- /dev/null
> +++ b/src/patches/bash/bash51-010
> @@ -0,0 +1,59 @@
> +			     BASH PATCH REPORT
> +			     =================
> +
> +Bash-Release:	5.1
> +Patch-ID:	bash51-010
> +
> +Bug-Reported-by:	Jonas Alfredsson <jonas.alfredsson@protonmail.com>
> +Bug-Reference-ID:	<LjAfZaEuZncr2RaqhSSfcaiXdkuK6kdEYxshP3LApXbgMVQzggMGyWHO9knVkXicW2fP-ibsipJ_GZ-YaJRm96Rsozf6PgFmPsljRCtflls=@protonmail.com>
> +Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2021-05/msg00059.html
> +
> +Bug-Description:
> +
> +If `wait -n' is interrupted by a trapped signal other than SIGINT, it does
> +not completely clean up state, and that can prevent subsequent calls to
> +`wait -n' from working correctly.
> +
> +Patch (apply with `patch -p0'):
> +
> +*** ../bash-5.1-patched/builtins/wait.def	2020-12-16 17:13:12.000000000 -0500
> +--- builtins/wait.def	2021-11-17 10:25:15.000000000 -0500
> +***************
> +*** 112,116 ****
> +       WORD_LIST *list;
> +  {
> +!   int status, code, opt, nflag, wflags;
> +    char *vname;
> +    SHELL_VAR *pidvar;
> +--- 112,117 ----
> +       WORD_LIST *list;
> +  {
> +!   int status, code, opt, nflag;
> +!   volatile int wflags;
> +    char *vname;
> +    SHELL_VAR *pidvar;
> +***************
> +*** 181,184 ****
> +--- 188,193 ----
> +        status = 128 + wait_signal_received;
> +        wait_sigint_cleanup ();
> ++       if (wflags & JWAIT_WAITING)
> ++ 	unset_waitlist ();
> +        WAIT_RETURN (status);
> +      }
> +
> +*** ../bash-5.1/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 9
> +  
> +  #endif /* _PATCHLEVEL_H_ */
> +--- 26,30 ----
> +     looks for to find the patch level (for the sccs version string). */
> +  
> +! #define PATCHLEVEL 10
> +  
> +  #endif /* _PATCHLEVEL_H_ */
> diff --git a/src/patches/bash/bash51-011 b/src/patches/bash/bash51-011
> new file mode 100644
> index 000000000..655c7ec8b
> --- /dev/null
> +++ b/src/patches/bash/bash51-011
> @@ -0,0 +1,81 @@
> +			     BASH PATCH REPORT
> +			     =================
> +
> +Bash-Release:	5.1
> +Patch-ID:	bash51-011
> +
> +Bug-Reported-by:	Alex fxmbsw7 Ratchev <fxmbsw7@gmail.com>
> +Bug-Reference-ID:	<CAALKErFrm+yuwy=ioK+RmjCiwxTDmzeMFWqLF2BEWYtkGS5UFQ@mail.gmail.com>
> +Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-11/msg00064.html
> +
> +Bug-Description:
> +
> +When reading a compound assignment, and running it through the parser to
> +split it into words, we need to save and restore any alias we're currently
> +expanding.
> +
> +Patch (apply with `patch -p0'):
> +
> +*** ../bash-5.1-patched/parse.y	2020-11-28 12:10:06.000000000 -0500
> +--- parse.y	2021-10-13 11:04:27.000000000 -0400
> +***************
> +*** 6494,6501 ****
> +  
> +    push_stream (1);
> +- #if 0 /* TAG: bash-5.2 Alex fxmbsw7 Ratchev <fxmbsw7@gmail.com> 11/17/2020 */
> +    if (ea = expanding_alias ())
> +      parser_save_alias ();
> +- #endif
> +    last_read_token = WORD;		/* WORD to allow reserved words here */
> +    current_command_line_count = 0;
> +--- 6494,6499 ----
> +***************
> +*** 6532,6539 ****
> +    pop_stream ();
> +  
> +- #if 0 /* TAG: bash-5.2 */
> +    if (ea)
> +      parser_restore_alias ();
> +- #endif
> +  
> +  #if defined (HISTORY)
> +--- 6530,6535 ----
> +*** ../bash-5.1-patched/y.tab.c	2020-11-28 12:17:19.000000000 -0500
> +--- y.tab.c	2021-11-17 10:47:35.000000000 -0500
> +***************
> +*** 8788,8795 ****
> +  
> +    push_stream (1);
> +- #if 0 /* TAG: bash-5.2 Alex fxmbsw7 Ratchev <fxmbsw7@gmail.com> 11/17/2020 */
> +    if (ea = expanding_alias ())
> +      parser_save_alias ();
> +- #endif
> +    last_read_token = WORD;		/* WORD to allow reserved words here */
> +    current_command_line_count = 0;
> +--- 8777,8782 ----
> +***************
> +*** 8826,8833 ****
> +    pop_stream ();
> +  
> +- #if 0 /* TAG: bash-5.2 */
> +    if (ea)
> +      parser_restore_alias ();
> +- #endif
> +  
> +  #if defined (HISTORY)
> +--- 8813,8818 ----
> +*** ../bash-5.1/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 10
> +  
> +  #endif /* _PATCHLEVEL_H_ */
> +--- 26,30 ----
> +     looks for to find the patch level (for the sccs version string). */
> +  
> +! #define PATCHLEVEL 11
> +  
> +  #endif /* _PATCHLEVEL_H_ */
> diff --git a/src/patches/bash/bash51-012 b/src/patches/bash/bash51-012
> new file mode 100644
> index 000000000..222491884
> --- /dev/null
> +++ b/src/patches/bash/bash51-012
> @@ -0,0 +1,198 @@
> +			     BASH PATCH REPORT
> +			     =================
> +
> +Bash-Release:	5.1
> +Patch-ID:	bash51-012
> +
> +Bug-Reported-by:	Nikolay Borisov <nborisov@suse.com>
> +Bug-Reference-ID:	<1a715205-06ce-413b-c1c0-2f5639ce06c0@suse.com>
> +Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-11/msg00091.html
> +
> +Bug-Description:
> +
> +There is a possible race condition that arises when a child process receives
> +a signal trapped by the parent before it can reset the signal dispositions.
> +The child process is not supposed to trap the signal in this circumstance.
> +
> +Patch (apply with `patch -p0'):
> +
> +*** ../bash-20201118/command.h	2020-08-14 15:04:39.000000000 -0400
> +--- command.h	2020-11-27 15:18:02.000000000 -0500
> +***************
> +*** 125,128 ****
> +--- 125,129 ----
> +  #define SUBSHELL_COPROC	0x40	/* subshell from a coproc pipeline */
> +  #define SUBSHELL_RESETTRAP 0x80	/* subshell needs to reset trap strings on first call to trap */
> ++ #define SUBSHELL_IGNTRAP 0x100  /* subshell should reset trapped signals from trap_handler */
> +  
> +  /* A structure which represents a word. */
> +
> +*** ../bash-20201118/execute_cmd.c	2020-11-23 14:16:48.000000000 -0500
> +--- execute_cmd.c	2020-11-27 16:43:25.000000000 -0500
> +***************
> +*** 1548,1551 ****
> +--- 1548,1554 ----
> +    reset_signal_handlers ();
> +    subshell_environment |= SUBSHELL_RESETTRAP;
> ++   /* Note that signal handlers have been reset, so we should no longer
> ++     reset the handler and resend trapped signals to ourselves. */
> ++   subshell_environment &= ~SUBSHELL_IGNTRAP;
> +  
> +    /* We are in a subshell, so forget that we are running a trap handler or
> +***************
> +*** 4321,4325 ****
> +  	  cmdflags |= CMD_NO_FORK;
> +  
> +! 	  subshell_environment = SUBSHELL_FORK;		/* XXX */
> +  	  if (pipe_in != NO_PIPE || pipe_out != NO_PIPE)
> +  	    subshell_environment |= SUBSHELL_PIPE;
> +--- 4324,4329 ----
> +  	  cmdflags |= CMD_NO_FORK;
> +  
> +! 	  /* We redo some of what make_child() does with SUBSHELL_IGNTRAP */
> +! 	  subshell_environment = SUBSHELL_FORK|SUBSHELL_IGNTRAP;	/* XXX */
> +  	  if (pipe_in != NO_PIPE || pipe_out != NO_PIPE)
> +  	    subshell_environment |= SUBSHELL_PIPE;
> +***************
> +*** 4575,4578 ****
> +--- 4580,4584 ----
> +  	  reset_signal_handlers ();
> +  	  subshell_environment |= SUBSHELL_RESETTRAP;
> ++ 	  subshell_environment &= ~SUBSHELL_IGNTRAP;
> +  
> +  	  if (async)
> +***************
> +*** 5515,5518 ****
> +--- 5521,5525 ----
> +        /* Cancel traps, in trap.c. */
> +        restore_original_signals ();
> ++       subshell_environment &= ~SUBSHELL_IGNTRAP;
> +  
> +  #if defined (JOB_CONTROL)
> +
> +*** ../bash-20201118/jobs.c	2020-08-04 10:17:39.000000000 -0400
> +--- jobs.c	2020-11-27 16:39:56.000000000 -0500
> +***************
> +*** 2218,2221 ****
> +--- 2218,2223 ----
> +        pid_t mypid;
> +  
> ++       subshell_environment |= SUBSHELL_IGNTRAP;
> ++ 
> +        /* If this ends up being changed to modify or use `command' in the
> +  	 child process, go back and change callers who free `command' in
> +diff -rC 2 ../bash-20201118/nojobs.c nojobs.c
> +*** ../bash-20201118/nojobs.c	2020-07-08 10:11:25.000000000 -0400
> +--- nojobs.c	2020-11-27 16:38:36.000000000 -0500
> +***************
> +*** 576,579 ****
> +--- 576,581 ----
> +  #endif
> +  
> ++       subshell_environment |= SUBSHELL_IGNTRAP;
> ++ 
> +        default_tty_job_signals ();
> +      }
> +
> +*** ../bash-20201118/sig.c	2020-11-23 13:22:17.000000000 -0500
> +--- sig.c	2020-11-28 10:21:43.000000000 -0500
> +***************
> +*** 56,60 ****
> +  #endif
> +  
> +! extern void initialize_siglist ();
> +  
> +  #if !defined (JOB_CONTROL)
> +--- 56,61 ----
> +  #endif
> +  
> +! extern void initialize_siglist PARAMS((void));
> +! extern void set_original_signal PARAMS((int, SigHandler *));
> +  
> +  #if !defined (JOB_CONTROL)
> +***************
> +*** 256,259 ****
> +--- 257,267 ----
> +        XHANDLER(i) = oact.sa_handler;
> +        XSAFLAGS(i) = oact.sa_flags;
> ++ 
> ++ #if 0
> ++       set_original_signal (XSIG(i), XHANDLER(i));	/* optimization */
> ++ #else
> ++       set_original_signal (XSIG(i), act.sa_handler);	/* optimization */
> ++ #endif
> ++ 
> +        /* Don't do anything with signals that are ignored at shell entry
> +  	 if the shell is not interactive. */
> +
> +*** ../bash-20201118/subst.c	2020-11-16 10:33:15.000000000 -0500
> +--- subst.c	2020-11-27 16:07:00.000000000 -0500
> +***************
> +*** 5952,5955 ****
> +--- 5952,5956 ----
> +        /* Cancel traps, in trap.c. */
> +        restore_original_signals ();	/* XXX - what about special builtins? bash-4.2 */
> ++       subshell_environment &= ~SUBSHELL_IGNTRAP;
> +        QUIT;	/* catch any interrupts we got post-fork */
> +        setup_async_signals ();
> +***************
> +*** 6383,6386 ****
> +--- 6384,6388 ----
> +        QUIT;	/* catch any interrupts we got post-fork */
> +        subshell_environment |= SUBSHELL_RESETTRAP;
> ++       subshell_environment &= ~SUBSHELL_IGNTRAP;
> +      }
> +  
> +
> +diff -rC 2 ../bash-20201118/trap.c trap.c
> +*** ../bash-20201118/trap.c	2020-11-28 12:04:07.000000000 -0500
> +--- trap.c	2020-11-28 10:22:10.000000000 -0500
> +***************
> +*** 482,485 ****
> +--- 482,511 ----
> +      }
> +  
> ++   /* This means we're in a subshell, but have not yet reset the handler for
> ++      trapped signals. We're not supposed to execute the trap in this situation;
> ++      we should restore the original signal and resend the signal to ourselves
> ++      to preserve the Posix "signal traps that are not being ignored shall be
> ++      set to the default action" semantics. */
> ++   if ((subshell_environment & SUBSHELL_IGNTRAP) && trap_list[sig] != (char *)IGNORE_SIG)
> ++     {
> ++       sigset_t mask;
> ++ 
> ++       /* Paranoia */
> ++       if (original_signals[sig] == IMPOSSIBLE_TRAP_HANDLER)
> ++ 	original_signals[sig] = SIG_DFL;
> ++ 
> ++       restore_signal (sig);
> ++ 
> ++       /* Make sure we let the signal we just caught through */
> ++       sigemptyset (&mask);
> ++       sigprocmask (SIG_SETMASK, (sigset_t *)NULL, &mask);
> ++       sigdelset (&mask, sig);
> ++       sigprocmask (SIG_SETMASK, &mask, (sigset_t *)NULL);
> ++ 
> ++       kill (getpid (), sig);
> ++ 
> ++       SIGRETURN (0);
> ++     }
> ++ 
> +    if ((sig >= NSIG) ||
> +        (trap_list[sig] == (char *)DEFAULT_SIG) ||
> +
> +*** ../bash-5.1/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 11
> +  
> +  #endif /* _PATCHLEVEL_H_ */
> +--- 26,30 ----
> +     looks for to find the patch level (for the sccs version string). */
> +  
> +! #define PATCHLEVEL 12
> +  
> +  #endif /* _PATCHLEVEL_H_ */
> -- 
> 2.34.1
>
  
Adolf Belka Dec. 7, 2021, 12:30 p.m. UTC | #2
Hi Michael,

On 07/12/2021 12:17, Michael Tremer wrote:
> Hello,
> 
> Thank you for this patch.
> 
> Isn’t it a bit odd that upstream released a tarball for 5.1.8 but not for .12?
> 
> Isn’t it easier to just import the patches and stick with the original 5.1 tarball?
I thought about that but then I saw the 5,1,8 tarball and thought if it is there why not use it as it has all the patches from 1 to 8 already merged in so saves a little time in patching :-) but I have no real hard view either way.
If you would rather that bash always stays with its first tarball of a series and we use all the patches provided I can also do that.

Regards,
Adolf.
> 
> It will all result in the same piece of software. I am just curious.
> 
> -Michael
> 
>> On 6 Dec 2021, at 21:06, Adolf Belka <adolf.belka@ipfire.org> wrote:
>>
>> - Update main file from 5.1 to 5.1.8 (includes patches 1 to 8)
>> - Remove patches 1 to 4
>> - Changelog - Patches 1 to 4 from the previous IPFire version together with patches 5 to
>>      8 are now included into bash-5.1.8 followed by application of patches 9 to 12
>>    Patch 12
>>     There is a possible race condition that arises when a child process receives
>>      a signal trapped by the parent before it can reset the signal dispositions.
>>      The child process is not supposed to trap the signal in this circumstance.
>>    Patch 11
>>     When reading a compound assignment, and running it through the parser to
>>      split it into words, we need to save and restore any alias we're currently
>>      expanding.
>>    Patch 10
>>     If `wait -n' is interrupted by a trapped signal other than SIGINT, it does
>>      not completely clean up state, and that can prevent subsequent calls to
>>      `wait -n' from working correctly.
>>    Patch 9
>>     The bash malloc implementation of malloc_usable_size() does not follow the
>>      specification. This can cause library functions that use it to overwrite
>>      memory bounds checking.
>>    Patch 8
>>     Process substitution FIFOs opened by child processes as targets of redirections
>>      were not removed appropriately, leaving remnants in the file system.
>>    Patch 7
>>     The code to check readline versions in an inputrc file had the sense of the
>>      comparisons reversed.
>>    Patch 6
>>     Make sure child processes forked to run command substitutions are in the
>>      proper process group.
>>    Patch 5
>>     Fix two memory leaks when assigning arrays using compound assignment syntax.
>>
>> Signed-off-by: Adolf Belka <adolf.belka@ipfire.org>
>> ---
>> lfs/bash                    |   6 +-
>> src/patches/bash/bash51-001 |  80 ---------------
>> src/patches/bash/bash51-002 |  57 -----------
>> src/patches/bash/bash51-003 |  53 ----------
>> src/patches/bash/bash51-004 | 126 -----------------------
>> src/patches/bash/bash51-009 |  59 +++++++++++
>> src/patches/bash/bash51-010 |  59 +++++++++++
>> src/patches/bash/bash51-011 |  81 +++++++++++++++
>> src/patches/bash/bash51-012 | 198 ++++++++++++++++++++++++++++++++++++
>> 9 files changed, 400 insertions(+), 319 deletions(-)
>> delete mode 100644 src/patches/bash/bash51-001
>> delete mode 100644 src/patches/bash/bash51-002
>> delete mode 100644 src/patches/bash/bash51-003
>> delete mode 100644 src/patches/bash/bash51-004
>> create mode 100644 src/patches/bash/bash51-009
>> create mode 100644 src/patches/bash/bash51-010
>> create mode 100644 src/patches/bash/bash51-011
>> create mode 100644 src/patches/bash/bash51-012
>>
>> diff --git a/lfs/bash b/lfs/bash
>> index 7b0baccad..1bf3eb2ec 100644
>> --- a/lfs/bash
>> +++ b/lfs/bash
>> @@ -24,7 +24,7 @@
>>
>> include Config
>>
>> -VER        = 5.1
>> +VER        = 5.1.8
>>
>> THISAPP    = bash-$(VER)
>> DL_FILE    = $(THISAPP).tar.gz
>> @@ -53,7 +53,7 @@ objects = $(DL_FILE)
>>
>> $(DL_FILE)             = $(DL_FROM)/$(DL_FILE)
>>
>> -$(DL_FILE)_MD5         = bb91a17fd6c9032c26d0b2b78b50aff5
>> +$(DL_FILE)_MD5         = 23eee6195b47318b9fd878e590ccb38c
>>
>> install : $(TARGET)
>>
>> @@ -87,7 +87,7 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
>> 	sed -e "s/filename, RTLD_LAZY/filename, RTLD_NOW/" \
>> 		-i $(DIR_APP)/builtins/enable.def
>>
>> -	for i in $$(seq 1 4); do \
>> +	for i in $$(seq 9 12); do \
>> 		cd $(DIR_APP) && patch -Np0 < $(DIR_SRC)/src/patches/bash/bash51-$$(printf "%03d" "$${i}") || exit 1; \
>> 	done
>>
>> diff --git a/src/patches/bash/bash51-001 b/src/patches/bash/bash51-001
>> deleted file mode 100644
>> index 6f29981d2..000000000
>> --- a/src/patches/bash/bash51-001
>> +++ /dev/null
>> @@ -1,80 +0,0 @@
>> -			     BASH PATCH REPORT
>> -			     =================
>> -
>> -Bash-Release:	5.1
>> -Patch-ID:	bash51-001
>> -
>> -Bug-Reported-by:	Fazal Majid <fazal@majid.org>
>> -Bug-Reference-ID:	<DEAB7D2C-C626-450C-B2E5-281AFF2D26D4@majid.org>
>> -Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-12/msg00000.html
>> -
>> -Bug-Description:
>> -
>> -There is a missing dependency on a constructed file, which can cause highly
>> -parellel builds to fail.
>> -
>> -Patch (apply with `patch -p0'):
>> -
>> -*** ../bash-5.1-patched/Makefile.in	2020-12-04 09:51:19.000000000 -0500
>> ---- Makefile.in	2020-12-16 11:28:36.000000000 -0500
>> -***************
>> -*** 1316,1319 ****
>> ---- 1316,1320 ----
>> -  bashline.o: pcomplete.h ${BASHINCDIR}/chartypes.h input.h
>> -  bashline.o: ${BASHINCDIR}/shmbutil.h ${BASHINCDIR}/shmbchar.h
>> -+ bashline.o: ${DEFDIR}/builtext.h
>> -  bracecomp.o: config.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h
>> -  bracecomp.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h
>> -***************
>> -*** 1436,1439 ****
>> ---- 1437,1441 ----
>> -  builtins/evalstring.o: jobs.h builtins.h flags.h input.h execute_cmd.h
>> -  builtins/evalstring.o: bashhist.h $(DEFSRC)/common.h pathnames.h
>> -+ builtins/evalstring.o: ${DEFDIR}/builtext.h
>> -  builtins/getopt.o: config.h ${BASHINCDIR}/memalloc.h
>> -  builtins/getopt.o: shell.h syntax.h bashjmp.h command.h general.h xmalloc.h error.h
>> -
>> -*** ../bash-5.1-patched/builtins/Makefile.in	2019-07-25 08:03:45.000000000 -0400
>> ---- builtins/Makefile.in	2020-12-16 11:29:29.000000000 -0500
>> -***************
>> -*** 362,366 ****
>> -  evalstring.o: $(topdir)/flags.h $(topdir)/input.h $(topdir)/execute_cmd.h
>> -  evalstring.o: $(topdir)/bashhist.h $(srcdir)/common.h
>> -! evalstring.o: $(topdir)/trap.h $(topdir)/redir.h ../pathnames.h
>> -  #evalstring.o: $(topdir)/y.tab.h
>> -  getopt.o: ../config.h $(BASHINCDIR)/memalloc.h
>> ---- 362,366 ----
>> -  evalstring.o: $(topdir)/flags.h $(topdir)/input.h $(topdir)/execute_cmd.h
>> -  evalstring.o: $(topdir)/bashhist.h $(srcdir)/common.h
>> -! evalstring.o: $(topdir)/trap.h $(topdir)/redir.h ../pathnames.h ./builtext.h
>> -  #evalstring.o: $(topdir)/y.tab.h
>> -  getopt.o: ../config.h $(BASHINCDIR)/memalloc.h
>> -
>> -*** ../bash-5.1/patchlevel.h	2020-06-22 14:51:03.000000000 -0400
>> ---- patchlevel.h	2020-10-01 11:01:28.000000000 -0400
>> -***************
>> -*** 1,5 ****
>> -  /* patchlevel.h -- current bash patch level */
>> -
>> -! /* Copyright (C) 2001-2016 Free Software Foundation, Inc.
>> -
>> -     This file is part of GNU Bash, the Bourne Again SHell.
>> ---- 1,5 ----
>> -  /* patchlevel.h -- current bash patch level */
>> -
>> -! /* Copyright (C) 2001-2020 Free Software Foundation, Inc.
>> -
>> -     This file is part of GNU Bash, the Bourne Again SHell.
>> -***************
>> -*** 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/bash51-002 b/src/patches/bash/bash51-002
>> deleted file mode 100644
>> index 8c991649a..000000000
>> --- a/src/patches/bash/bash51-002
>> +++ /dev/null
>> @@ -1,57 +0,0 @@
>> -			     BASH PATCH REPORT
>> -			     =================
>> -
>> -Bash-Release:	5.1
>> -Patch-ID:	bash51-002
>> -
>> -Bug-Reported-by:	oguzismailuysal@gmail.com
>> -Bug-Reference-ID:	<CAH7i3LoHFUa4aSF5-AD2r80HG-p-YzD_9ZxomarZkhP8NMq63g@mail.gmail.com>
>> -Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-12/msg00037.html
>> -
>> -Bug-Description:
>> -
>> -If there are no jobs, and the `-n' and `-p' options are both supplied to
>> -`wait', bash can assign a value to the variable name specified with `-p'
>> -instead of leaving it unset.
>> -
>> -Patch (apply with `patch -p0'):
>> -
>> -*** ../bash-5.1-patched/builtins/wait.def	2020-04-09 15:13:57.000000000 -0400
>> ---- builtins/wait.def	2020-12-11 09:46:49.000000000 -0500
>> -***************
>> -*** 214,222 ****
>> -
>> -        status = wait_for_any_job (wflags, &pstat);
>> --       if (status < 0)
>> -- 	status = 127;
>> -- 
>> -        if (vname && status >= 0)
>> -  	bind_var_to_int (vname, pstat.pid);
>> -        if (list)
>> -  	unset_waitlist ();
>> ---- 214,222 ----
>> -
>> -        status = wait_for_any_job (wflags, &pstat);
>> -        if (vname && status >= 0)
>> -  	bind_var_to_int (vname, pstat.pid);
>> -+
>> -+       if (status < 0)
>> -+ 	status = 127;
>> -        if (list)
>> -  	unset_waitlist ();
>> -
>> -*** ../bash-5.1/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/bash51-003 b/src/patches/bash/bash51-003
>> deleted file mode 100644
>> index 68e5dce6a..000000000
>> --- a/src/patches/bash/bash51-003
>> +++ /dev/null
>> @@ -1,53 +0,0 @@
>> -			     BASH PATCH REPORT
>> -			     =================
>> -
>> -Bash-Release:	5.1
>> -Patch-ID:	bash51-003
>> -
>> -Bug-Reported-by:	oguzismailuysal@gmail.com
>> -Bug-Reference-ID:	<CAH7i3LpG91BnNcDtaTUm2Ph7a+PnJkuh6nAc87cVL7_38tOaMQ@mail.gmail.com>
>> -Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-12/msg00050.html
>> -
>> -Bug-Description:
>> -
>> -Bash does not put a command substitution process that is started to perform an
>> -expansion in a child process into the right process group where it can receive
>> -keyboard-generated signals.
>> -
>> -Patch (apply with `patch -p0'):
>> -
>> -*** ../bash-5.1-patched/subst.c	2020-11-16 10:33:15.000000000 -0500
>> ---- subst.c	2020-12-12 13:50:11.000000000 -0500
>> -***************
>> -*** 6357,6362 ****
>> -  #if defined (JOB_CONTROL)
>> -    old_pipeline_pgrp = pipeline_pgrp;
>> -!   /* Don't reset the pipeline pgrp if we're already a subshell in a pipeline. */
>> -!   if ((subshell_environment & SUBSHELL_PIPE) == 0)
>> -      pipeline_pgrp = shell_pgrp;
>> -    cleanup_the_pipeline ();
>> ---- 6357,6364 ----
>> -  #if defined (JOB_CONTROL)
>> -    old_pipeline_pgrp = pipeline_pgrp;
>> -!   /* Don't reset the pipeline pgrp if we're already a subshell in a pipeline or
>> -!      we've already forked to run a disk command (and are expanding redirections,
>> -!      for example). */
>> -!   if ((subshell_environment & (SUBSHELL_FORK|SUBSHELL_PIPE)) == 0)
>> -      pipeline_pgrp = shell_pgrp;
>> -    cleanup_the_pipeline ();
>> -
>> -*** ../bash-5.1/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/bash51-004 b/src/patches/bash/bash51-004
>> deleted file mode 100644
>> index 39a6c647f..000000000
>> --- a/src/patches/bash/bash51-004
>> +++ /dev/null
>> @@ -1,126 +0,0 @@
>> -			     BASH PATCH REPORT
>> -			     =================
>> -
>> -Bash-Release:	5.1
>> -Patch-ID:	bash51-004
>> -
>> -Bug-Reported-by:	oguzismailuysal@gmail.com
>> -Bug-Reference-ID:	<CAH7i3LoHGmwaghDpCWRUfcY04gQmeDTH3RiG=bf2b=KbU=gyhw@mail.gmail.com>
>> -Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-12/msg00039.html
>> -
>> -Bug-Description:
>> -
>> -If a key-value compound array assignment to an associative array is supplied
>> -as an assignment statement argument to the `declare' command that declares the
>> -array, the assignment doesn't perform the correct word expansions.
>> -
>> -This patch makes key-value assignment and subscript assignment perform the
>> -same expansions when they're supplied as an argument to `declare'.
>> -
>> -Patch (apply with `patch -p0'):
>> -
>> -*** ../bash-5.1-patched/arrayfunc.c	2020-10-09 11:38:58.000000000 -0400
>> ---- arrayfunc.c	2020-12-11 15:12:22.000000000 -0500
>> -***************
>> -*** 598,601 ****
>> ---- 598,622 ----
>> -      }
>> -  }
>> -+
>> -+ /* Return non-zero if L appears to be a key-value pair associative array
>> -+    compound assignment. */
>> -+ int
>> -+ kvpair_assignment_p (l)
>> -+      WORD_LIST *l;
>> -+ {
>> -+   return (l && (l->word->flags & W_ASSIGNMENT) == 0 && l->word->word[0] != '[');	/*]*/
>> -+ }
>> -+
>> -+ char *
>> -+ expand_and_quote_kvpair_word (w)
>> -+      char *w;
>> -+ {
>> -+   char *t, *r;
>> -+
>> -+   t = w ? expand_assignment_string_to_string (w, 0) : 0;
>> -+   r = sh_single_quote (t ? t : "");
>> -+   free (t);
>> -+   return r;
>> -+ }
>> -  #endif
>> -
>> -***************
>> -*** 641,645 ****
>> -
>> -  #if ASSOC_KVPAIR_ASSIGNMENT
>> -!   if (assoc_p (var) && nlist && (nlist->word->flags & W_ASSIGNMENT) == 0 && nlist->word->word[0] != '[')	/*]*/
>> -      {
>> -        iflags = flags & ~ASS_APPEND;
>> ---- 662,666 ----
>> -
>> -  #if ASSOC_KVPAIR_ASSIGNMENT
>> -!   if (assoc_p (var) && kvpair_assignment_p (nlist))
>> -      {
>> -        iflags = flags & ~ASS_APPEND;
>> -*** ../bash-5.1-patched/arrayfunc.h	2020-04-29 17:24:15.000000000 -0400
>> ---- arrayfunc.h	2020-12-11 14:23:50.000000000 -0500
>> -***************
>> -*** 68,71 ****
>> ---- 68,74 ----
>> -  extern void quote_compound_array_list PARAMS((WORD_LIST *, int));
>> -
>> -+ extern int kvpair_assignment_p PARAMS((WORD_LIST *));
>> -+ extern char *expand_and_quote_kvpair_word PARAMS((char *));
>> -+
>> -  extern int unbind_array_element PARAMS((SHELL_VAR *, char *, int));
>> -  extern int skipsubscript PARAMS((const char *, int, int));
>> -*** ../bash-5.1-patched/subst.c	2020-11-16 10:33:15.000000000 -0500
>> ---- subst.c	2020-12-11 15:11:10.000000000 -0500
>> -***************
>> -*** 11605,11608 ****
>> ---- 11605,11609 ----
>> -    WORD_LIST *l, *nl;
>> -    char *t;
>> -+   int kvpair;
>> -
>> -    if (flags == 0)
>> -***************
>> -*** 11619,11622 ****
>> ---- 11620,11627 ----
>> -        /* Associative array */
>> -        l = parse_string_to_word_list (value, 1, "array assign");
>> -+ #if ASSOC_KVPAIR_ASSIGNMENT
>> -+       kvpair = kvpair_assignment_p (l);
>> -+ #endif
>> -+
>> -        /* For associative arrays, with their arbitrary subscripts, we have to
>> -  	 expand and quote in one step so we don't have to search for the
>> -***************
>> -*** 11624,11627 ****
>> ---- 11629,11638 ----
>> -        for (nl = l; nl; nl = nl->next)
>> -  	{
>> -+ #if ASSOC_KVPAIR_ASSIGNMENT
>> -+ 	  if (kvpair)
>> -+ 	    /* keys and values undergo the same set of expansions */
>> -+ 	    t = expand_and_quote_kvpair_word (nl->word->word);
>> -+ 	  else
>> -+ #endif
>> -  	  if ((nl->word->flags & W_ASSIGNMENT) == 0)
>> -  	    t = sh_single_quote (nl->word->word ? nl->word->word : "");
>> -
>> -*** ../bash-5.1/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/bash51-009 b/src/patches/bash/bash51-009
>> new file mode 100644
>> index 000000000..2796c3b9b
>> --- /dev/null
>> +++ b/src/patches/bash/bash51-009
>> @@ -0,0 +1,59 @@
>> +			     BASH PATCH REPORT
>> +			     =================
>> +
>> +Bash-Release:	5.1
>> +Patch-ID:	bash51-009
>> +
>> +Bug-Reported-by:	Julien Moutinho <julm+bash@sourcephile.fr>
>> +Bug-Reference-ID:	<20211004035906.5kiobuzkpeckmvwg@sourcephile.fr>
>> +Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2021-10/msg00022.html
>> +
>> +Bug-Description:
>> +
>> +The bash malloc implementation of malloc_usable_size() does not follow the
>> +specification. This can cause library functions that use it to overwrite
>> +memory bounds checking.
>> +
>> +Patch (apply with `patch -p0'):
>> +
>> +*** ../bash-5.1-patched/lib/malloc/malloc.c	2020-07-08 10:19:30.000000000 -0400
>> +--- lib/malloc/malloc.c	2021-10-05 16:10:55.000000000 -0400
>> +***************
>> +*** 1287,1297 ****
>> +      }
>> +
>> +!   /* XXX - should we return 0 if ISFREE? */
>> +!   maxbytes = binsize(p->mh_index);
>> +!
>> +!   /* So the usable size is the maximum number of bytes in the bin less the
>> +!      malloc overhead */
>> +!   maxbytes -= MOVERHEAD + MSLOP;
>> +!   return (maxbytes);
>> +  }
>> +
>> +--- 1358,1367 ----
>> +      }
>> +
>> +!   /* return 0 if ISFREE */
>> +!   if (p->mh_alloc == ISFREE)
>> +!     return 0;
>> +!
>> +!   /* Since we use bounds checking, the usable size is the last requested size. */
>> +!   return (p->mh_nbytes);
>> +  }
>> +
>> +*** ../bash-5.1/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_ */
>> diff --git a/src/patches/bash/bash51-010 b/src/patches/bash/bash51-010
>> new file mode 100644
>> index 000000000..cfe6fa46b
>> --- /dev/null
>> +++ b/src/patches/bash/bash51-010
>> @@ -0,0 +1,59 @@
>> +			     BASH PATCH REPORT
>> +			     =================
>> +
>> +Bash-Release:	5.1
>> +Patch-ID:	bash51-010
>> +
>> +Bug-Reported-by:	Jonas Alfredsson <jonas.alfredsson@protonmail.com>
>> +Bug-Reference-ID:	<LjAfZaEuZncr2RaqhSSfcaiXdkuK6kdEYxshP3LApXbgMVQzggMGyWHO9knVkXicW2fP-ibsipJ_GZ-YaJRm96Rsozf6PgFmPsljRCtflls=@protonmail.com>
>> +Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2021-05/msg00059.html
>> +
>> +Bug-Description:
>> +
>> +If `wait -n' is interrupted by a trapped signal other than SIGINT, it does
>> +not completely clean up state, and that can prevent subsequent calls to
>> +`wait -n' from working correctly.
>> +
>> +Patch (apply with `patch -p0'):
>> +
>> +*** ../bash-5.1-patched/builtins/wait.def	2020-12-16 17:13:12.000000000 -0500
>> +--- builtins/wait.def	2021-11-17 10:25:15.000000000 -0500
>> +***************
>> +*** 112,116 ****
>> +       WORD_LIST *list;
>> +  {
>> +!   int status, code, opt, nflag, wflags;
>> +    char *vname;
>> +    SHELL_VAR *pidvar;
>> +--- 112,117 ----
>> +       WORD_LIST *list;
>> +  {
>> +!   int status, code, opt, nflag;
>> +!   volatile int wflags;
>> +    char *vname;
>> +    SHELL_VAR *pidvar;
>> +***************
>> +*** 181,184 ****
>> +--- 188,193 ----
>> +        status = 128 + wait_signal_received;
>> +        wait_sigint_cleanup ();
>> ++       if (wflags & JWAIT_WAITING)
>> ++ 	unset_waitlist ();
>> +        WAIT_RETURN (status);
>> +      }
>> +
>> +*** ../bash-5.1/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 9
>> +
>> +  #endif /* _PATCHLEVEL_H_ */
>> +--- 26,30 ----
>> +     looks for to find the patch level (for the sccs version string). */
>> +
>> +! #define PATCHLEVEL 10
>> +
>> +  #endif /* _PATCHLEVEL_H_ */
>> diff --git a/src/patches/bash/bash51-011 b/src/patches/bash/bash51-011
>> new file mode 100644
>> index 000000000..655c7ec8b
>> --- /dev/null
>> +++ b/src/patches/bash/bash51-011
>> @@ -0,0 +1,81 @@
>> +			     BASH PATCH REPORT
>> +			     =================
>> +
>> +Bash-Release:	5.1
>> +Patch-ID:	bash51-011
>> +
>> +Bug-Reported-by:	Alex fxmbsw7 Ratchev <fxmbsw7@gmail.com>
>> +Bug-Reference-ID:	<CAALKErFrm+yuwy=ioK+RmjCiwxTDmzeMFWqLF2BEWYtkGS5UFQ@mail.gmail.com>
>> +Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-11/msg00064.html
>> +
>> +Bug-Description:
>> +
>> +When reading a compound assignment, and running it through the parser to
>> +split it into words, we need to save and restore any alias we're currently
>> +expanding.
>> +
>> +Patch (apply with `patch -p0'):
>> +
>> +*** ../bash-5.1-patched/parse.y	2020-11-28 12:10:06.000000000 -0500
>> +--- parse.y	2021-10-13 11:04:27.000000000 -0400
>> +***************
>> +*** 6494,6501 ****
>> +
>> +    push_stream (1);
>> +- #if 0 /* TAG: bash-5.2 Alex fxmbsw7 Ratchev <fxmbsw7@gmail.com> 11/17/2020 */
>> +    if (ea = expanding_alias ())
>> +      parser_save_alias ();
>> +- #endif
>> +    last_read_token = WORD;		/* WORD to allow reserved words here */
>> +    current_command_line_count = 0;
>> +--- 6494,6499 ----
>> +***************
>> +*** 6532,6539 ****
>> +    pop_stream ();
>> +
>> +- #if 0 /* TAG: bash-5.2 */
>> +    if (ea)
>> +      parser_restore_alias ();
>> +- #endif
>> +
>> +  #if defined (HISTORY)
>> +--- 6530,6535 ----
>> +*** ../bash-5.1-patched/y.tab.c	2020-11-28 12:17:19.000000000 -0500
>> +--- y.tab.c	2021-11-17 10:47:35.000000000 -0500
>> +***************
>> +*** 8788,8795 ****
>> +
>> +    push_stream (1);
>> +- #if 0 /* TAG: bash-5.2 Alex fxmbsw7 Ratchev <fxmbsw7@gmail.com> 11/17/2020 */
>> +    if (ea = expanding_alias ())
>> +      parser_save_alias ();
>> +- #endif
>> +    last_read_token = WORD;		/* WORD to allow reserved words here */
>> +    current_command_line_count = 0;
>> +--- 8777,8782 ----
>> +***************
>> +*** 8826,8833 ****
>> +    pop_stream ();
>> +
>> +- #if 0 /* TAG: bash-5.2 */
>> +    if (ea)
>> +      parser_restore_alias ();
>> +- #endif
>> +
>> +  #if defined (HISTORY)
>> +--- 8813,8818 ----
>> +*** ../bash-5.1/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 10
>> +
>> +  #endif /* _PATCHLEVEL_H_ */
>> +--- 26,30 ----
>> +     looks for to find the patch level (for the sccs version string). */
>> +
>> +! #define PATCHLEVEL 11
>> +
>> +  #endif /* _PATCHLEVEL_H_ */
>> diff --git a/src/patches/bash/bash51-012 b/src/patches/bash/bash51-012
>> new file mode 100644
>> index 000000000..222491884
>> --- /dev/null
>> +++ b/src/patches/bash/bash51-012
>> @@ -0,0 +1,198 @@
>> +			     BASH PATCH REPORT
>> +			     =================
>> +
>> +Bash-Release:	5.1
>> +Patch-ID:	bash51-012
>> +
>> +Bug-Reported-by:	Nikolay Borisov <nborisov@suse.com>
>> +Bug-Reference-ID:	<1a715205-06ce-413b-c1c0-2f5639ce06c0@suse.com>
>> +Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-11/msg00091.html
>> +
>> +Bug-Description:
>> +
>> +There is a possible race condition that arises when a child process receives
>> +a signal trapped by the parent before it can reset the signal dispositions.
>> +The child process is not supposed to trap the signal in this circumstance.
>> +
>> +Patch (apply with `patch -p0'):
>> +
>> +*** ../bash-20201118/command.h	2020-08-14 15:04:39.000000000 -0400
>> +--- command.h	2020-11-27 15:18:02.000000000 -0500
>> +***************
>> +*** 125,128 ****
>> +--- 125,129 ----
>> +  #define SUBSHELL_COPROC	0x40	/* subshell from a coproc pipeline */
>> +  #define SUBSHELL_RESETTRAP 0x80	/* subshell needs to reset trap strings on first call to trap */
>> ++ #define SUBSHELL_IGNTRAP 0x100  /* subshell should reset trapped signals from trap_handler */
>> +
>> +  /* A structure which represents a word. */
>> +
>> +*** ../bash-20201118/execute_cmd.c	2020-11-23 14:16:48.000000000 -0500
>> +--- execute_cmd.c	2020-11-27 16:43:25.000000000 -0500
>> +***************
>> +*** 1548,1551 ****
>> +--- 1548,1554 ----
>> +    reset_signal_handlers ();
>> +    subshell_environment |= SUBSHELL_RESETTRAP;
>> ++   /* Note that signal handlers have been reset, so we should no longer
>> ++     reset the handler and resend trapped signals to ourselves. */
>> ++   subshell_environment &= ~SUBSHELL_IGNTRAP;
>> +
>> +    /* We are in a subshell, so forget that we are running a trap handler or
>> +***************
>> +*** 4321,4325 ****
>> +  	  cmdflags |= CMD_NO_FORK;
>> +
>> +! 	  subshell_environment = SUBSHELL_FORK;		/* XXX */
>> +  	  if (pipe_in != NO_PIPE || pipe_out != NO_PIPE)
>> +  	    subshell_environment |= SUBSHELL_PIPE;
>> +--- 4324,4329 ----
>> +  	  cmdflags |= CMD_NO_FORK;
>> +
>> +! 	  /* We redo some of what make_child() does with SUBSHELL_IGNTRAP */
>> +! 	  subshell_environment = SUBSHELL_FORK|SUBSHELL_IGNTRAP;	/* XXX */
>> +  	  if (pipe_in != NO_PIPE || pipe_out != NO_PIPE)
>> +  	    subshell_environment |= SUBSHELL_PIPE;
>> +***************
>> +*** 4575,4578 ****
>> +--- 4580,4584 ----
>> +  	  reset_signal_handlers ();
>> +  	  subshell_environment |= SUBSHELL_RESETTRAP;
>> ++ 	  subshell_environment &= ~SUBSHELL_IGNTRAP;
>> +
>> +  	  if (async)
>> +***************
>> +*** 5515,5518 ****
>> +--- 5521,5525 ----
>> +        /* Cancel traps, in trap.c. */
>> +        restore_original_signals ();
>> ++       subshell_environment &= ~SUBSHELL_IGNTRAP;
>> +
>> +  #if defined (JOB_CONTROL)
>> +
>> +*** ../bash-20201118/jobs.c	2020-08-04 10:17:39.000000000 -0400
>> +--- jobs.c	2020-11-27 16:39:56.000000000 -0500
>> +***************
>> +*** 2218,2221 ****
>> +--- 2218,2223 ----
>> +        pid_t mypid;
>> +
>> ++       subshell_environment |= SUBSHELL_IGNTRAP;
>> ++
>> +        /* If this ends up being changed to modify or use `command' in the
>> +  	 child process, go back and change callers who free `command' in
>> +diff -rC 2 ../bash-20201118/nojobs.c nojobs.c
>> +*** ../bash-20201118/nojobs.c	2020-07-08 10:11:25.000000000 -0400
>> +--- nojobs.c	2020-11-27 16:38:36.000000000 -0500
>> +***************
>> +*** 576,579 ****
>> +--- 576,581 ----
>> +  #endif
>> +
>> ++       subshell_environment |= SUBSHELL_IGNTRAP;
>> ++
>> +        default_tty_job_signals ();
>> +      }
>> +
>> +*** ../bash-20201118/sig.c	2020-11-23 13:22:17.000000000 -0500
>> +--- sig.c	2020-11-28 10:21:43.000000000 -0500
>> +***************
>> +*** 56,60 ****
>> +  #endif
>> +
>> +! extern void initialize_siglist ();
>> +
>> +  #if !defined (JOB_CONTROL)
>> +--- 56,61 ----
>> +  #endif
>> +
>> +! extern void initialize_siglist PARAMS((void));
>> +! extern void set_original_signal PARAMS((int, SigHandler *));
>> +
>> +  #if !defined (JOB_CONTROL)
>> +***************
>> +*** 256,259 ****
>> +--- 257,267 ----
>> +        XHANDLER(i) = oact.sa_handler;
>> +        XSAFLAGS(i) = oact.sa_flags;
>> ++
>> ++ #if 0
>> ++       set_original_signal (XSIG(i), XHANDLER(i));	/* optimization */
>> ++ #else
>> ++       set_original_signal (XSIG(i), act.sa_handler);	/* optimization */
>> ++ #endif
>> ++
>> +        /* Don't do anything with signals that are ignored at shell entry
>> +  	 if the shell is not interactive. */
>> +
>> +*** ../bash-20201118/subst.c	2020-11-16 10:33:15.000000000 -0500
>> +--- subst.c	2020-11-27 16:07:00.000000000 -0500
>> +***************
>> +*** 5952,5955 ****
>> +--- 5952,5956 ----
>> +        /* Cancel traps, in trap.c. */
>> +        restore_original_signals ();	/* XXX - what about special builtins? bash-4.2 */
>> ++       subshell_environment &= ~SUBSHELL_IGNTRAP;
>> +        QUIT;	/* catch any interrupts we got post-fork */
>> +        setup_async_signals ();
>> +***************
>> +*** 6383,6386 ****
>> +--- 6384,6388 ----
>> +        QUIT;	/* catch any interrupts we got post-fork */
>> +        subshell_environment |= SUBSHELL_RESETTRAP;
>> ++       subshell_environment &= ~SUBSHELL_IGNTRAP;
>> +      }
>> +
>> +
>> +diff -rC 2 ../bash-20201118/trap.c trap.c
>> +*** ../bash-20201118/trap.c	2020-11-28 12:04:07.000000000 -0500
>> +--- trap.c	2020-11-28 10:22:10.000000000 -0500
>> +***************
>> +*** 482,485 ****
>> +--- 482,511 ----
>> +      }
>> +
>> ++   /* This means we're in a subshell, but have not yet reset the handler for
>> ++      trapped signals. We're not supposed to execute the trap in this situation;
>> ++      we should restore the original signal and resend the signal to ourselves
>> ++      to preserve the Posix "signal traps that are not being ignored shall be
>> ++      set to the default action" semantics. */
>> ++   if ((subshell_environment & SUBSHELL_IGNTRAP) && trap_list[sig] != (char *)IGNORE_SIG)
>> ++     {
>> ++       sigset_t mask;
>> ++
>> ++       /* Paranoia */
>> ++       if (original_signals[sig] == IMPOSSIBLE_TRAP_HANDLER)
>> ++ 	original_signals[sig] = SIG_DFL;
>> ++
>> ++       restore_signal (sig);
>> ++
>> ++       /* Make sure we let the signal we just caught through */
>> ++       sigemptyset (&mask);
>> ++       sigprocmask (SIG_SETMASK, (sigset_t *)NULL, &mask);
>> ++       sigdelset (&mask, sig);
>> ++       sigprocmask (SIG_SETMASK, &mask, (sigset_t *)NULL);
>> ++
>> ++       kill (getpid (), sig);
>> ++
>> ++       SIGRETURN (0);
>> ++     }
>> ++
>> +    if ((sig >= NSIG) ||
>> +        (trap_list[sig] == (char *)DEFAULT_SIG) ||
>> +
>> +*** ../bash-5.1/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 11
>> +
>> +  #endif /* _PATCHLEVEL_H_ */
>> +--- 26,30 ----
>> +     looks for to find the patch level (for the sccs version string). */
>> +
>> +! #define PATCHLEVEL 12
>> +
>> +  #endif /* _PATCHLEVEL_H_ */
>> -- 
>> 2.34.1
>>
>
  
Michael Tremer Dec. 7, 2021, 12:47 p.m. UTC | #3
Hello,

> On 7 Dec 2021, at 12:30, Adolf Belka <adolf.belka@ipfire.org> wrote:
> 
> Hi Michael,
> 
> On 07/12/2021 12:17, Michael Tremer wrote:
>> Hello,
>> Thank you for this patch.
>> Isn’t it a bit odd that upstream released a tarball for 5.1.8 but not for .12?
>> Isn’t it easier to just import the patches and stick with the original 5.1 tarball?
> I thought about that but then I saw the 5,1,8 tarball and thought if it is there why not use it as it has all the patches from 1 to 8 already merged in so saves a little time in patching :-) but I have no real hard view either way.
> If you would rather that bash always stays with its first tarball of a series and we use all the patches provided I can also do that.

I actually have no preference. The result should be the same.

> 
> Regards,
> Adolf.
>> It will all result in the same piece of software. I am just curious.
>> -Michael
>>> On 6 Dec 2021, at 21:06, Adolf Belka <adolf.belka@ipfire.org> wrote:
>>> 
>>> - Update main file from 5.1 to 5.1.8 (includes patches 1 to 8)
>>> - Remove patches 1 to 4
>>> - Changelog - Patches 1 to 4 from the previous IPFire version together with patches 5 to
>>>     8 are now included into bash-5.1.8 followed by application of patches 9 to 12
>>>   Patch 12
>>>    There is a possible race condition that arises when a child process receives
>>>     a signal trapped by the parent before it can reset the signal dispositions.
>>>     The child process is not supposed to trap the signal in this circumstance.
>>>   Patch 11
>>>    When reading a compound assignment, and running it through the parser to
>>>     split it into words, we need to save and restore any alias we're currently
>>>     expanding.
>>>   Patch 10
>>>    If `wait -n' is interrupted by a trapped signal other than SIGINT, it does
>>>     not completely clean up state, and that can prevent subsequent calls to
>>>     `wait -n' from working correctly.
>>>   Patch 9
>>>    The bash malloc implementation of malloc_usable_size() does not follow the
>>>     specification. This can cause library functions that use it to overwrite
>>>     memory bounds checking.
>>>   Patch 8
>>>    Process substitution FIFOs opened by child processes as targets of redirections
>>>     were not removed appropriately, leaving remnants in the file system.
>>>   Patch 7
>>>    The code to check readline versions in an inputrc file had the sense of the
>>>     comparisons reversed.
>>>   Patch 6
>>>    Make sure child processes forked to run command substitutions are in the
>>>     proper process group.
>>>   Patch 5
>>>    Fix two memory leaks when assigning arrays using compound assignment syntax.
>>> 
>>> Signed-off-by: Adolf Belka <adolf.belka@ipfire.org>
>>> ---
>>> lfs/bash                    |   6 +-
>>> src/patches/bash/bash51-001 |  80 ---------------
>>> src/patches/bash/bash51-002 |  57 -----------
>>> src/patches/bash/bash51-003 |  53 ----------
>>> src/patches/bash/bash51-004 | 126 -----------------------
>>> src/patches/bash/bash51-009 |  59 +++++++++++
>>> src/patches/bash/bash51-010 |  59 +++++++++++
>>> src/patches/bash/bash51-011 |  81 +++++++++++++++
>>> src/patches/bash/bash51-012 | 198 ++++++++++++++++++++++++++++++++++++
>>> 9 files changed, 400 insertions(+), 319 deletions(-)
>>> delete mode 100644 src/patches/bash/bash51-001
>>> delete mode 100644 src/patches/bash/bash51-002
>>> delete mode 100644 src/patches/bash/bash51-003
>>> delete mode 100644 src/patches/bash/bash51-004
>>> create mode 100644 src/patches/bash/bash51-009
>>> create mode 100644 src/patches/bash/bash51-010
>>> create mode 100644 src/patches/bash/bash51-011
>>> create mode 100644 src/patches/bash/bash51-012
>>> 
>>> diff --git a/lfs/bash b/lfs/bash
>>> index 7b0baccad..1bf3eb2ec 100644
>>> --- a/lfs/bash
>>> +++ b/lfs/bash
>>> @@ -24,7 +24,7 @@
>>> 
>>> include Config
>>> 
>>> -VER        = 5.1
>>> +VER        = 5.1.8
>>> 
>>> THISAPP    = bash-$(VER)
>>> DL_FILE    = $(THISAPP).tar.gz
>>> @@ -53,7 +53,7 @@ objects = $(DL_FILE)
>>> 
>>> $(DL_FILE)             = $(DL_FROM)/$(DL_FILE)
>>> 
>>> -$(DL_FILE)_MD5         = bb91a17fd6c9032c26d0b2b78b50aff5
>>> +$(DL_FILE)_MD5         = 23eee6195b47318b9fd878e590ccb38c
>>> 
>>> install : $(TARGET)
>>> 
>>> @@ -87,7 +87,7 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
>>> 	sed -e "s/filename, RTLD_LAZY/filename, RTLD_NOW/" \
>>> 		-i $(DIR_APP)/builtins/enable.def
>>> 
>>> -	for i in $$(seq 1 4); do \
>>> +	for i in $$(seq 9 12); do \
>>> 		cd $(DIR_APP) && patch -Np0 < $(DIR_SRC)/src/patches/bash/bash51-$$(printf "%03d" "$${i}") || exit 1; \
>>> 	done
>>> 
>>> diff --git a/src/patches/bash/bash51-001 b/src/patches/bash/bash51-001
>>> deleted file mode 100644
>>> index 6f29981d2..000000000
>>> --- a/src/patches/bash/bash51-001
>>> +++ /dev/null
>>> @@ -1,80 +0,0 @@
>>> -			     BASH PATCH REPORT
>>> -			     =================
>>> -
>>> -Bash-Release:	5.1
>>> -Patch-ID:	bash51-001
>>> -
>>> -Bug-Reported-by:	Fazal Majid <fazal@majid.org>
>>> -Bug-Reference-ID:	<DEAB7D2C-C626-450C-B2E5-281AFF2D26D4@majid.org>
>>> -Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-12/msg00000.html
>>> -
>>> -Bug-Description:
>>> -
>>> -There is a missing dependency on a constructed file, which can cause highly
>>> -parellel builds to fail.
>>> -
>>> -Patch (apply with `patch -p0'):
>>> -
>>> -*** ../bash-5.1-patched/Makefile.in	2020-12-04 09:51:19.000000000 -0500
>>> ---- Makefile.in	2020-12-16 11:28:36.000000000 -0500
>>> -***************
>>> -*** 1316,1319 ****
>>> ---- 1316,1320 ----
>>> -  bashline.o: pcomplete.h ${BASHINCDIR}/chartypes.h input.h
>>> -  bashline.o: ${BASHINCDIR}/shmbutil.h ${BASHINCDIR}/shmbchar.h
>>> -+ bashline.o: ${DEFDIR}/builtext.h
>>> -  bracecomp.o: config.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h
>>> -  bracecomp.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h
>>> -***************
>>> -*** 1436,1439 ****
>>> ---- 1437,1441 ----
>>> -  builtins/evalstring.o: jobs.h builtins.h flags.h input.h execute_cmd.h
>>> -  builtins/evalstring.o: bashhist.h $(DEFSRC)/common.h pathnames.h
>>> -+ builtins/evalstring.o: ${DEFDIR}/builtext.h
>>> -  builtins/getopt.o: config.h ${BASHINCDIR}/memalloc.h
>>> -  builtins/getopt.o: shell.h syntax.h bashjmp.h command.h general.h xmalloc.h error.h
>>> -
>>> -*** ../bash-5.1-patched/builtins/Makefile.in	2019-07-25 08:03:45.000000000 -0400
>>> ---- builtins/Makefile.in	2020-12-16 11:29:29.000000000 -0500
>>> -***************
>>> -*** 362,366 ****
>>> -  evalstring.o: $(topdir)/flags.h $(topdir)/input.h $(topdir)/execute_cmd.h
>>> -  evalstring.o: $(topdir)/bashhist.h $(srcdir)/common.h
>>> -! evalstring.o: $(topdir)/trap.h $(topdir)/redir.h ../pathnames.h
>>> -  #evalstring.o: $(topdir)/y.tab.h
>>> -  getopt.o: ../config.h $(BASHINCDIR)/memalloc.h
>>> ---- 362,366 ----
>>> -  evalstring.o: $(topdir)/flags.h $(topdir)/input.h $(topdir)/execute_cmd.h
>>> -  evalstring.o: $(topdir)/bashhist.h $(srcdir)/common.h
>>> -! evalstring.o: $(topdir)/trap.h $(topdir)/redir.h ../pathnames.h ./builtext.h
>>> -  #evalstring.o: $(topdir)/y.tab.h
>>> -  getopt.o: ../config.h $(BASHINCDIR)/memalloc.h
>>> -
>>> -*** ../bash-5.1/patchlevel.h	2020-06-22 14:51:03.000000000 -0400
>>> ---- patchlevel.h	2020-10-01 11:01:28.000000000 -0400
>>> -***************
>>> -*** 1,5 ****
>>> -  /* patchlevel.h -- current bash patch level */
>>> -
>>> -! /* Copyright (C) 2001-2016 Free Software Foundation, Inc.
>>> -
>>> -     This file is part of GNU Bash, the Bourne Again SHell.
>>> ---- 1,5 ----
>>> -  /* patchlevel.h -- current bash patch level */
>>> -
>>> -! /* Copyright (C) 2001-2020 Free Software Foundation, Inc.
>>> -
>>> -     This file is part of GNU Bash, the Bourne Again SHell.
>>> -***************
>>> -*** 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/bash51-002 b/src/patches/bash/bash51-002
>>> deleted file mode 100644
>>> index 8c991649a..000000000
>>> --- a/src/patches/bash/bash51-002
>>> +++ /dev/null
>>> @@ -1,57 +0,0 @@
>>> -			     BASH PATCH REPORT
>>> -			     =================
>>> -
>>> -Bash-Release:	5.1
>>> -Patch-ID:	bash51-002
>>> -
>>> -Bug-Reported-by:	oguzismailuysal@gmail.com
>>> -Bug-Reference-ID:	<CAH7i3LoHFUa4aSF5-AD2r80HG-p-YzD_9ZxomarZkhP8NMq63g@mail.gmail.com>
>>> -Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-12/msg00037.html
>>> -
>>> -Bug-Description:
>>> -
>>> -If there are no jobs, and the `-n' and `-p' options are both supplied to
>>> -`wait', bash can assign a value to the variable name specified with `-p'
>>> -instead of leaving it unset.
>>> -
>>> -Patch (apply with `patch -p0'):
>>> -
>>> -*** ../bash-5.1-patched/builtins/wait.def	2020-04-09 15:13:57.000000000 -0400
>>> ---- builtins/wait.def	2020-12-11 09:46:49.000000000 -0500
>>> -***************
>>> -*** 214,222 ****
>>> -
>>> -        status = wait_for_any_job (wflags, &pstat);
>>> --       if (status < 0)
>>> -- 	status = 127;
>>> -- 
>>> -        if (vname && status >= 0)
>>> -  	bind_var_to_int (vname, pstat.pid);
>>> -        if (list)
>>> -  	unset_waitlist ();
>>> ---- 214,222 ----
>>> -
>>> -        status = wait_for_any_job (wflags, &pstat);
>>> -        if (vname && status >= 0)
>>> -  	bind_var_to_int (vname, pstat.pid);
>>> -+
>>> -+       if (status < 0)
>>> -+ 	status = 127;
>>> -        if (list)
>>> -  	unset_waitlist ();
>>> -
>>> -*** ../bash-5.1/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/bash51-003 b/src/patches/bash/bash51-003
>>> deleted file mode 100644
>>> index 68e5dce6a..000000000
>>> --- a/src/patches/bash/bash51-003
>>> +++ /dev/null
>>> @@ -1,53 +0,0 @@
>>> -			     BASH PATCH REPORT
>>> -			     =================
>>> -
>>> -Bash-Release:	5.1
>>> -Patch-ID:	bash51-003
>>> -
>>> -Bug-Reported-by:	oguzismailuysal@gmail.com
>>> -Bug-Reference-ID:	<CAH7i3LpG91BnNcDtaTUm2Ph7a+PnJkuh6nAc87cVL7_38tOaMQ@mail.gmail.com>
>>> -Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-12/msg00050.html
>>> -
>>> -Bug-Description:
>>> -
>>> -Bash does not put a command substitution process that is started to perform an
>>> -expansion in a child process into the right process group where it can receive
>>> -keyboard-generated signals.
>>> -
>>> -Patch (apply with `patch -p0'):
>>> -
>>> -*** ../bash-5.1-patched/subst.c	2020-11-16 10:33:15.000000000 -0500
>>> ---- subst.c	2020-12-12 13:50:11.000000000 -0500
>>> -***************
>>> -*** 6357,6362 ****
>>> -  #if defined (JOB_CONTROL)
>>> -    old_pipeline_pgrp = pipeline_pgrp;
>>> -!   /* Don't reset the pipeline pgrp if we're already a subshell in a pipeline. */
>>> -!   if ((subshell_environment & SUBSHELL_PIPE) == 0)
>>> -      pipeline_pgrp = shell_pgrp;
>>> -    cleanup_the_pipeline ();
>>> ---- 6357,6364 ----
>>> -  #if defined (JOB_CONTROL)
>>> -    old_pipeline_pgrp = pipeline_pgrp;
>>> -!   /* Don't reset the pipeline pgrp if we're already a subshell in a pipeline or
>>> -!      we've already forked to run a disk command (and are expanding redirections,
>>> -!      for example). */
>>> -!   if ((subshell_environment & (SUBSHELL_FORK|SUBSHELL_PIPE)) == 0)
>>> -      pipeline_pgrp = shell_pgrp;
>>> -    cleanup_the_pipeline ();
>>> -
>>> -*** ../bash-5.1/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/bash51-004 b/src/patches/bash/bash51-004
>>> deleted file mode 100644
>>> index 39a6c647f..000000000
>>> --- a/src/patches/bash/bash51-004
>>> +++ /dev/null
>>> @@ -1,126 +0,0 @@
>>> -			     BASH PATCH REPORT
>>> -			     =================
>>> -
>>> -Bash-Release:	5.1
>>> -Patch-ID:	bash51-004
>>> -
>>> -Bug-Reported-by:	oguzismailuysal@gmail.com
>>> -Bug-Reference-ID:	<CAH7i3LoHGmwaghDpCWRUfcY04gQmeDTH3RiG=bf2b=KbU=gyhw@mail.gmail.com>
>>> -Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-12/msg00039.html
>>> -
>>> -Bug-Description:
>>> -
>>> -If a key-value compound array assignment to an associative array is supplied
>>> -as an assignment statement argument to the `declare' command that declares the
>>> -array, the assignment doesn't perform the correct word expansions.
>>> -
>>> -This patch makes key-value assignment and subscript assignment perform the
>>> -same expansions when they're supplied as an argument to `declare'.
>>> -
>>> -Patch (apply with `patch -p0'):
>>> -
>>> -*** ../bash-5.1-patched/arrayfunc.c	2020-10-09 11:38:58.000000000 -0400
>>> ---- arrayfunc.c	2020-12-11 15:12:22.000000000 -0500
>>> -***************
>>> -*** 598,601 ****
>>> ---- 598,622 ----
>>> -      }
>>> -  }
>>> -+
>>> -+ /* Return non-zero if L appears to be a key-value pair associative array
>>> -+    compound assignment. */
>>> -+ int
>>> -+ kvpair_assignment_p (l)
>>> -+      WORD_LIST *l;
>>> -+ {
>>> -+   return (l && (l->word->flags & W_ASSIGNMENT) == 0 && l->word->word[0] != '[');	/*]*/
>>> -+ }
>>> -+
>>> -+ char *
>>> -+ expand_and_quote_kvpair_word (w)
>>> -+      char *w;
>>> -+ {
>>> -+   char *t, *r;
>>> -+
>>> -+   t = w ? expand_assignment_string_to_string (w, 0) : 0;
>>> -+   r = sh_single_quote (t ? t : "");
>>> -+   free (t);
>>> -+   return r;
>>> -+ }
>>> -  #endif
>>> -
>>> -***************
>>> -*** 641,645 ****
>>> -
>>> -  #if ASSOC_KVPAIR_ASSIGNMENT
>>> -!   if (assoc_p (var) && nlist && (nlist->word->flags & W_ASSIGNMENT) == 0 && nlist->word->word[0] != '[')	/*]*/
>>> -      {
>>> -        iflags = flags & ~ASS_APPEND;
>>> ---- 662,666 ----
>>> -
>>> -  #if ASSOC_KVPAIR_ASSIGNMENT
>>> -!   if (assoc_p (var) && kvpair_assignment_p (nlist))
>>> -      {
>>> -        iflags = flags & ~ASS_APPEND;
>>> -*** ../bash-5.1-patched/arrayfunc.h	2020-04-29 17:24:15.000000000 -0400
>>> ---- arrayfunc.h	2020-12-11 14:23:50.000000000 -0500
>>> -***************
>>> -*** 68,71 ****
>>> ---- 68,74 ----
>>> -  extern void quote_compound_array_list PARAMS((WORD_LIST *, int));
>>> -
>>> -+ extern int kvpair_assignment_p PARAMS((WORD_LIST *));
>>> -+ extern char *expand_and_quote_kvpair_word PARAMS((char *));
>>> -+
>>> -  extern int unbind_array_element PARAMS((SHELL_VAR *, char *, int));
>>> -  extern int skipsubscript PARAMS((const char *, int, int));
>>> -*** ../bash-5.1-patched/subst.c	2020-11-16 10:33:15.000000000 -0500
>>> ---- subst.c	2020-12-11 15:11:10.000000000 -0500
>>> -***************
>>> -*** 11605,11608 ****
>>> ---- 11605,11609 ----
>>> -    WORD_LIST *l, *nl;
>>> -    char *t;
>>> -+   int kvpair;
>>> -
>>> -    if (flags == 0)
>>> -***************
>>> -*** 11619,11622 ****
>>> ---- 11620,11627 ----
>>> -        /* Associative array */
>>> -        l = parse_string_to_word_list (value, 1, "array assign");
>>> -+ #if ASSOC_KVPAIR_ASSIGNMENT
>>> -+       kvpair = kvpair_assignment_p (l);
>>> -+ #endif
>>> -+
>>> -        /* For associative arrays, with their arbitrary subscripts, we have to
>>> -  	 expand and quote in one step so we don't have to search for the
>>> -***************
>>> -*** 11624,11627 ****
>>> ---- 11629,11638 ----
>>> -        for (nl = l; nl; nl = nl->next)
>>> -  	{
>>> -+ #if ASSOC_KVPAIR_ASSIGNMENT
>>> -+ 	  if (kvpair)
>>> -+ 	    /* keys and values undergo the same set of expansions */
>>> -+ 	    t = expand_and_quote_kvpair_word (nl->word->word);
>>> -+ 	  else
>>> -+ #endif
>>> -  	  if ((nl->word->flags & W_ASSIGNMENT) == 0)
>>> -  	    t = sh_single_quote (nl->word->word ? nl->word->word : "");
>>> -
>>> -*** ../bash-5.1/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/bash51-009 b/src/patches/bash/bash51-009
>>> new file mode 100644
>>> index 000000000..2796c3b9b
>>> --- /dev/null
>>> +++ b/src/patches/bash/bash51-009
>>> @@ -0,0 +1,59 @@
>>> +			     BASH PATCH REPORT
>>> +			     =================
>>> +
>>> +Bash-Release:	5.1
>>> +Patch-ID:	bash51-009
>>> +
>>> +Bug-Reported-by:	Julien Moutinho <julm+bash@sourcephile.fr>
>>> +Bug-Reference-ID:	<20211004035906.5kiobuzkpeckmvwg@sourcephile.fr>
>>> +Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2021-10/msg00022.html
>>> +
>>> +Bug-Description:
>>> +
>>> +The bash malloc implementation of malloc_usable_size() does not follow the
>>> +specification. This can cause library functions that use it to overwrite
>>> +memory bounds checking.
>>> +
>>> +Patch (apply with `patch -p0'):
>>> +
>>> +*** ../bash-5.1-patched/lib/malloc/malloc.c	2020-07-08 10:19:30.000000000 -0400
>>> +--- lib/malloc/malloc.c	2021-10-05 16:10:55.000000000 -0400
>>> +***************
>>> +*** 1287,1297 ****
>>> +      }
>>> +
>>> +!   /* XXX - should we return 0 if ISFREE? */
>>> +!   maxbytes = binsize(p->mh_index);
>>> +!
>>> +!   /* So the usable size is the maximum number of bytes in the bin less the
>>> +!      malloc overhead */
>>> +!   maxbytes -= MOVERHEAD + MSLOP;
>>> +!   return (maxbytes);
>>> +  }
>>> +
>>> +--- 1358,1367 ----
>>> +      }
>>> +
>>> +!   /* return 0 if ISFREE */
>>> +!   if (p->mh_alloc == ISFREE)
>>> +!     return 0;
>>> +!
>>> +!   /* Since we use bounds checking, the usable size is the last requested size. */
>>> +!   return (p->mh_nbytes);
>>> +  }
>>> +
>>> +*** ../bash-5.1/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_ */
>>> diff --git a/src/patches/bash/bash51-010 b/src/patches/bash/bash51-010
>>> new file mode 100644
>>> index 000000000..cfe6fa46b
>>> --- /dev/null
>>> +++ b/src/patches/bash/bash51-010
>>> @@ -0,0 +1,59 @@
>>> +			     BASH PATCH REPORT
>>> +			     =================
>>> +
>>> +Bash-Release:	5.1
>>> +Patch-ID:	bash51-010
>>> +
>>> +Bug-Reported-by:	Jonas Alfredsson <jonas.alfredsson@protonmail.com>
>>> +Bug-Reference-ID:	<LjAfZaEuZncr2RaqhSSfcaiXdkuK6kdEYxshP3LApXbgMVQzggMGyWHO9knVkXicW2fP-ibsipJ_GZ-YaJRm96Rsozf6PgFmPsljRCtflls=@protonmail.com>
>>> +Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2021-05/msg00059.html
>>> +
>>> +Bug-Description:
>>> +
>>> +If `wait -n' is interrupted by a trapped signal other than SIGINT, it does
>>> +not completely clean up state, and that can prevent subsequent calls to
>>> +`wait -n' from working correctly.
>>> +
>>> +Patch (apply with `patch -p0'):
>>> +
>>> +*** ../bash-5.1-patched/builtins/wait.def	2020-12-16 17:13:12.000000000 -0500
>>> +--- builtins/wait.def	2021-11-17 10:25:15.000000000 -0500
>>> +***************
>>> +*** 112,116 ****
>>> +       WORD_LIST *list;
>>> +  {
>>> +!   int status, code, opt, nflag, wflags;
>>> +    char *vname;
>>> +    SHELL_VAR *pidvar;
>>> +--- 112,117 ----
>>> +       WORD_LIST *list;
>>> +  {
>>> +!   int status, code, opt, nflag;
>>> +!   volatile int wflags;
>>> +    char *vname;
>>> +    SHELL_VAR *pidvar;
>>> +***************
>>> +*** 181,184 ****
>>> +--- 188,193 ----
>>> +        status = 128 + wait_signal_received;
>>> +        wait_sigint_cleanup ();
>>> ++       if (wflags & JWAIT_WAITING)
>>> ++ 	unset_waitlist ();
>>> +        WAIT_RETURN (status);
>>> +      }
>>> +
>>> +*** ../bash-5.1/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 9
>>> +
>>> +  #endif /* _PATCHLEVEL_H_ */
>>> +--- 26,30 ----
>>> +     looks for to find the patch level (for the sccs version string). */
>>> +
>>> +! #define PATCHLEVEL 10
>>> +
>>> +  #endif /* _PATCHLEVEL_H_ */
>>> diff --git a/src/patches/bash/bash51-011 b/src/patches/bash/bash51-011
>>> new file mode 100644
>>> index 000000000..655c7ec8b
>>> --- /dev/null
>>> +++ b/src/patches/bash/bash51-011
>>> @@ -0,0 +1,81 @@
>>> +			     BASH PATCH REPORT
>>> +			     =================
>>> +
>>> +Bash-Release:	5.1
>>> +Patch-ID:	bash51-011
>>> +
>>> +Bug-Reported-by:	Alex fxmbsw7 Ratchev <fxmbsw7@gmail.com>
>>> +Bug-Reference-ID:	<CAALKErFrm+yuwy=ioK+RmjCiwxTDmzeMFWqLF2BEWYtkGS5UFQ@mail.gmail.com>
>>> +Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-11/msg00064.html
>>> +
>>> +Bug-Description:
>>> +
>>> +When reading a compound assignment, and running it through the parser to
>>> +split it into words, we need to save and restore any alias we're currently
>>> +expanding.
>>> +
>>> +Patch (apply with `patch -p0'):
>>> +
>>> +*** ../bash-5.1-patched/parse.y	2020-11-28 12:10:06.000000000 -0500
>>> +--- parse.y	2021-10-13 11:04:27.000000000 -0400
>>> +***************
>>> +*** 6494,6501 ****
>>> +
>>> +    push_stream (1);
>>> +- #if 0 /* TAG: bash-5.2 Alex fxmbsw7 Ratchev <fxmbsw7@gmail.com> 11/17/2020 */
>>> +    if (ea = expanding_alias ())
>>> +      parser_save_alias ();
>>> +- #endif
>>> +    last_read_token = WORD;		/* WORD to allow reserved words here */
>>> +    current_command_line_count = 0;
>>> +--- 6494,6499 ----
>>> +***************
>>> +*** 6532,6539 ****
>>> +    pop_stream ();
>>> +
>>> +- #if 0 /* TAG: bash-5.2 */
>>> +    if (ea)
>>> +      parser_restore_alias ();
>>> +- #endif
>>> +
>>> +  #if defined (HISTORY)
>>> +--- 6530,6535 ----
>>> +*** ../bash-5.1-patched/y.tab.c	2020-11-28 12:17:19.000000000 -0500
>>> +--- y.tab.c	2021-11-17 10:47:35.000000000 -0500
>>> +***************
>>> +*** 8788,8795 ****
>>> +
>>> +    push_stream (1);
>>> +- #if 0 /* TAG: bash-5.2 Alex fxmbsw7 Ratchev <fxmbsw7@gmail.com> 11/17/2020 */
>>> +    if (ea = expanding_alias ())
>>> +      parser_save_alias ();
>>> +- #endif
>>> +    last_read_token = WORD;		/* WORD to allow reserved words here */
>>> +    current_command_line_count = 0;
>>> +--- 8777,8782 ----
>>> +***************
>>> +*** 8826,8833 ****
>>> +    pop_stream ();
>>> +
>>> +- #if 0 /* TAG: bash-5.2 */
>>> +    if (ea)
>>> +      parser_restore_alias ();
>>> +- #endif
>>> +
>>> +  #if defined (HISTORY)
>>> +--- 8813,8818 ----
>>> +*** ../bash-5.1/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 10
>>> +
>>> +  #endif /* _PATCHLEVEL_H_ */
>>> +--- 26,30 ----
>>> +     looks for to find the patch level (for the sccs version string). */
>>> +
>>> +! #define PATCHLEVEL 11
>>> +
>>> +  #endif /* _PATCHLEVEL_H_ */
>>> diff --git a/src/patches/bash/bash51-012 b/src/patches/bash/bash51-012
>>> new file mode 100644
>>> index 000000000..222491884
>>> --- /dev/null
>>> +++ b/src/patches/bash/bash51-012
>>> @@ -0,0 +1,198 @@
>>> +			     BASH PATCH REPORT
>>> +			     =================
>>> +
>>> +Bash-Release:	5.1
>>> +Patch-ID:	bash51-012
>>> +
>>> +Bug-Reported-by:	Nikolay Borisov <nborisov@suse.com>
>>> +Bug-Reference-ID:	<1a715205-06ce-413b-c1c0-2f5639ce06c0@suse.com>
>>> +Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-11/msg00091.html
>>> +
>>> +Bug-Description:
>>> +
>>> +There is a possible race condition that arises when a child process receives
>>> +a signal trapped by the parent before it can reset the signal dispositions.
>>> +The child process is not supposed to trap the signal in this circumstance.
>>> +
>>> +Patch (apply with `patch -p0'):
>>> +
>>> +*** ../bash-20201118/command.h	2020-08-14 15:04:39.000000000 -0400
>>> +--- command.h	2020-11-27 15:18:02.000000000 -0500
>>> +***************
>>> +*** 125,128 ****
>>> +--- 125,129 ----
>>> +  #define SUBSHELL_COPROC	0x40	/* subshell from a coproc pipeline */
>>> +  #define SUBSHELL_RESETTRAP 0x80	/* subshell needs to reset trap strings on first call to trap */
>>> ++ #define SUBSHELL_IGNTRAP 0x100  /* subshell should reset trapped signals from trap_handler */
>>> +
>>> +  /* A structure which represents a word. */
>>> +
>>> +*** ../bash-20201118/execute_cmd.c	2020-11-23 14:16:48.000000000 -0500
>>> +--- execute_cmd.c	2020-11-27 16:43:25.000000000 -0500
>>> +***************
>>> +*** 1548,1551 ****
>>> +--- 1548,1554 ----
>>> +    reset_signal_handlers ();
>>> +    subshell_environment |= SUBSHELL_RESETTRAP;
>>> ++   /* Note that signal handlers have been reset, so we should no longer
>>> ++     reset the handler and resend trapped signals to ourselves. */
>>> ++   subshell_environment &= ~SUBSHELL_IGNTRAP;
>>> +
>>> +    /* We are in a subshell, so forget that we are running a trap handler or
>>> +***************
>>> +*** 4321,4325 ****
>>> +  	  cmdflags |= CMD_NO_FORK;
>>> +
>>> +! 	  subshell_environment = SUBSHELL_FORK;		/* XXX */
>>> +  	  if (pipe_in != NO_PIPE || pipe_out != NO_PIPE)
>>> +  	    subshell_environment |= SUBSHELL_PIPE;
>>> +--- 4324,4329 ----
>>> +  	  cmdflags |= CMD_NO_FORK;
>>> +
>>> +! 	  /* We redo some of what make_child() does with SUBSHELL_IGNTRAP */
>>> +! 	  subshell_environment = SUBSHELL_FORK|SUBSHELL_IGNTRAP;	/* XXX */
>>> +  	  if (pipe_in != NO_PIPE || pipe_out != NO_PIPE)
>>> +  	    subshell_environment |= SUBSHELL_PIPE;
>>> +***************
>>> +*** 4575,4578 ****
>>> +--- 4580,4584 ----
>>> +  	  reset_signal_handlers ();
>>> +  	  subshell_environment |= SUBSHELL_RESETTRAP;
>>> ++ 	  subshell_environment &= ~SUBSHELL_IGNTRAP;
>>> +
>>> +  	  if (async)
>>> +***************
>>> +*** 5515,5518 ****
>>> +--- 5521,5525 ----
>>> +        /* Cancel traps, in trap.c. */
>>> +        restore_original_signals ();
>>> ++       subshell_environment &= ~SUBSHELL_IGNTRAP;
>>> +
>>> +  #if defined (JOB_CONTROL)
>>> +
>>> +*** ../bash-20201118/jobs.c	2020-08-04 10:17:39.000000000 -0400
>>> +--- jobs.c	2020-11-27 16:39:56.000000000 -0500
>>> +***************
>>> +*** 2218,2221 ****
>>> +--- 2218,2223 ----
>>> +        pid_t mypid;
>>> +
>>> ++       subshell_environment |= SUBSHELL_IGNTRAP;
>>> ++
>>> +        /* If this ends up being changed to modify or use `command' in the
>>> +  	 child process, go back and change callers who free `command' in
>>> +diff -rC 2 ../bash-20201118/nojobs.c nojobs.c
>>> +*** ../bash-20201118/nojobs.c	2020-07-08 10:11:25.000000000 -0400
>>> +--- nojobs.c	2020-11-27 16:38:36.000000000 -0500
>>> +***************
>>> +*** 576,579 ****
>>> +--- 576,581 ----
>>> +  #endif
>>> +
>>> ++       subshell_environment |= SUBSHELL_IGNTRAP;
>>> ++
>>> +        default_tty_job_signals ();
>>> +      }
>>> +
>>> +*** ../bash-20201118/sig.c	2020-11-23 13:22:17.000000000 -0500
>>> +--- sig.c	2020-11-28 10:21:43.000000000 -0500
>>> +***************
>>> +*** 56,60 ****
>>> +  #endif
>>> +
>>> +! extern void initialize_siglist ();
>>> +
>>> +  #if !defined (JOB_CONTROL)
>>> +--- 56,61 ----
>>> +  #endif
>>> +
>>> +! extern void initialize_siglist PARAMS((void));
>>> +! extern void set_original_signal PARAMS((int, SigHandler *));
>>> +
>>> +  #if !defined (JOB_CONTROL)
>>> +***************
>>> +*** 256,259 ****
>>> +--- 257,267 ----
>>> +        XHANDLER(i) = oact.sa_handler;
>>> +        XSAFLAGS(i) = oact.sa_flags;
>>> ++
>>> ++ #if 0
>>> ++       set_original_signal (XSIG(i), XHANDLER(i));	/* optimization */
>>> ++ #else
>>> ++       set_original_signal (XSIG(i), act.sa_handler);	/* optimization */
>>> ++ #endif
>>> ++
>>> +        /* Don't do anything with signals that are ignored at shell entry
>>> +  	 if the shell is not interactive. */
>>> +
>>> +*** ../bash-20201118/subst.c	2020-11-16 10:33:15.000000000 -0500
>>> +--- subst.c	2020-11-27 16:07:00.000000000 -0500
>>> +***************
>>> +*** 5952,5955 ****
>>> +--- 5952,5956 ----
>>> +        /* Cancel traps, in trap.c. */
>>> +        restore_original_signals ();	/* XXX - what about special builtins? bash-4.2 */
>>> ++       subshell_environment &= ~SUBSHELL_IGNTRAP;
>>> +        QUIT;	/* catch any interrupts we got post-fork */
>>> +        setup_async_signals ();
>>> +***************
>>> +*** 6383,6386 ****
>>> +--- 6384,6388 ----
>>> +        QUIT;	/* catch any interrupts we got post-fork */
>>> +        subshell_environment |= SUBSHELL_RESETTRAP;
>>> ++       subshell_environment &= ~SUBSHELL_IGNTRAP;
>>> +      }
>>> +
>>> +
>>> +diff -rC 2 ../bash-20201118/trap.c trap.c
>>> +*** ../bash-20201118/trap.c	2020-11-28 12:04:07.000000000 -0500
>>> +--- trap.c	2020-11-28 10:22:10.000000000 -0500
>>> +***************
>>> +*** 482,485 ****
>>> +--- 482,511 ----
>>> +      }
>>> +
>>> ++   /* This means we're in a subshell, but have not yet reset the handler for
>>> ++      trapped signals. We're not supposed to execute the trap in this situation;
>>> ++      we should restore the original signal and resend the signal to ourselves
>>> ++      to preserve the Posix "signal traps that are not being ignored shall be
>>> ++      set to the default action" semantics. */
>>> ++   if ((subshell_environment & SUBSHELL_IGNTRAP) && trap_list[sig] != (char *)IGNORE_SIG)
>>> ++     {
>>> ++       sigset_t mask;
>>> ++
>>> ++       /* Paranoia */
>>> ++       if (original_signals[sig] == IMPOSSIBLE_TRAP_HANDLER)
>>> ++ 	original_signals[sig] = SIG_DFL;
>>> ++
>>> ++       restore_signal (sig);
>>> ++
>>> ++       /* Make sure we let the signal we just caught through */
>>> ++       sigemptyset (&mask);
>>> ++       sigprocmask (SIG_SETMASK, (sigset_t *)NULL, &mask);
>>> ++       sigdelset (&mask, sig);
>>> ++       sigprocmask (SIG_SETMASK, &mask, (sigset_t *)NULL);
>>> ++
>>> ++       kill (getpid (), sig);
>>> ++
>>> ++       SIGRETURN (0);
>>> ++     }
>>> ++
>>> +    if ((sig >= NSIG) ||
>>> +        (trap_list[sig] == (char *)DEFAULT_SIG) ||
>>> +
>>> +*** ../bash-5.1/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 11
>>> +
>>> +  #endif /* _PATCHLEVEL_H_ */
>>> +--- 26,30 ----
>>> +     looks for to find the patch level (for the sccs version string). */
>>> +
>>> +! #define PATCHLEVEL 12
>>> +
>>> +  #endif /* _PATCHLEVEL_H_ */
>>> -- 
>>> 2.34.1
>>>
  
Peter Müller Dec. 9, 2021, 7:58 p.m. UTC | #4
Acked-by: Peter Müller <peter.mueller@ipfire.org>

> - Update main file from 5.1 to 5.1.8 (includes patches 1 to 8)
> - Remove patches 1 to 4
> - Changelog - Patches 1 to 4 from the previous IPFire version together with patches 5 to
>      8 are now included into bash-5.1.8 followed by application of patches 9 to 12
>    Patch 12
>     There is a possible race condition that arises when a child process receives
>      a signal trapped by the parent before it can reset the signal dispositions.
>      The child process is not supposed to trap the signal in this circumstance.
>    Patch 11
>     When reading a compound assignment, and running it through the parser to
>      split it into words, we need to save and restore any alias we're currently
>      expanding.
>    Patch 10
>     If `wait -n' is interrupted by a trapped signal other than SIGINT, it does
>      not completely clean up state, and that can prevent subsequent calls to
>      `wait -n' from working correctly.
>    Patch 9
>     The bash malloc implementation of malloc_usable_size() does not follow the
>      specification. This can cause library functions that use it to overwrite
>      memory bounds checking.
>    Patch 8
>     Process substitution FIFOs opened by child processes as targets of redirections
>      were not removed appropriately, leaving remnants in the file system.
>    Patch 7
>     The code to check readline versions in an inputrc file had the sense of the
>      comparisons reversed.
>    Patch 6
>     Make sure child processes forked to run command substitutions are in the
>      proper process group.
>    Patch 5
>     Fix two memory leaks when assigning arrays using compound assignment syntax.
> 
> Signed-off-by: Adolf Belka <adolf.belka@ipfire.org>
> ---
>  lfs/bash                    |   6 +-
>  src/patches/bash/bash51-001 |  80 ---------------
>  src/patches/bash/bash51-002 |  57 -----------
>  src/patches/bash/bash51-003 |  53 ----------
>  src/patches/bash/bash51-004 | 126 -----------------------
>  src/patches/bash/bash51-009 |  59 +++++++++++
>  src/patches/bash/bash51-010 |  59 +++++++++++
>  src/patches/bash/bash51-011 |  81 +++++++++++++++
>  src/patches/bash/bash51-012 | 198 ++++++++++++++++++++++++++++++++++++
>  9 files changed, 400 insertions(+), 319 deletions(-)
>  delete mode 100644 src/patches/bash/bash51-001
>  delete mode 100644 src/patches/bash/bash51-002
>  delete mode 100644 src/patches/bash/bash51-003
>  delete mode 100644 src/patches/bash/bash51-004
>  create mode 100644 src/patches/bash/bash51-009
>  create mode 100644 src/patches/bash/bash51-010
>  create mode 100644 src/patches/bash/bash51-011
>  create mode 100644 src/patches/bash/bash51-012
> 
> diff --git a/lfs/bash b/lfs/bash
> index 7b0baccad..1bf3eb2ec 100644
> --- a/lfs/bash
> +++ b/lfs/bash
> @@ -24,7 +24,7 @@
>  
>  include Config
>  
> -VER        = 5.1
> +VER        = 5.1.8
>  
>  THISAPP    = bash-$(VER)
>  DL_FILE    = $(THISAPP).tar.gz
> @@ -53,7 +53,7 @@ objects = $(DL_FILE)
>  
>  $(DL_FILE)             = $(DL_FROM)/$(DL_FILE)
>  
> -$(DL_FILE)_MD5         = bb91a17fd6c9032c26d0b2b78b50aff5
> +$(DL_FILE)_MD5         = 23eee6195b47318b9fd878e590ccb38c
>  
>  install : $(TARGET)
>  
> @@ -87,7 +87,7 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
>  	sed -e "s/filename, RTLD_LAZY/filename, RTLD_NOW/" \
>  		-i $(DIR_APP)/builtins/enable.def
>  
> -	for i in $$(seq 1 4); do \
> +	for i in $$(seq 9 12); do \
>  		cd $(DIR_APP) && patch -Np0 < $(DIR_SRC)/src/patches/bash/bash51-$$(printf "%03d" "$${i}") || exit 1; \
>  	done
>  
> diff --git a/src/patches/bash/bash51-001 b/src/patches/bash/bash51-001
> deleted file mode 100644
> index 6f29981d2..000000000
> --- a/src/patches/bash/bash51-001
> +++ /dev/null
> @@ -1,80 +0,0 @@
> -			     BASH PATCH REPORT
> -			     =================
> -
> -Bash-Release:	5.1
> -Patch-ID:	bash51-001
> -
> -Bug-Reported-by:	Fazal Majid <fazal@majid.org>
> -Bug-Reference-ID:	<DEAB7D2C-C626-450C-B2E5-281AFF2D26D4@majid.org>
> -Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-12/msg00000.html
> -
> -Bug-Description:
> -
> -There is a missing dependency on a constructed file, which can cause highly
> -parellel builds to fail.
> -
> -Patch (apply with `patch -p0'):
> -
> -*** ../bash-5.1-patched/Makefile.in	2020-12-04 09:51:19.000000000 -0500
> ---- Makefile.in	2020-12-16 11:28:36.000000000 -0500
> -***************
> -*** 1316,1319 ****
> ---- 1316,1320 ----
> -  bashline.o: pcomplete.h ${BASHINCDIR}/chartypes.h input.h
> -  bashline.o: ${BASHINCDIR}/shmbutil.h ${BASHINCDIR}/shmbchar.h
> -+ bashline.o: ${DEFDIR}/builtext.h
> -  bracecomp.o: config.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h
> -  bracecomp.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h
> -***************
> -*** 1436,1439 ****
> ---- 1437,1441 ----
> -  builtins/evalstring.o: jobs.h builtins.h flags.h input.h execute_cmd.h
> -  builtins/evalstring.o: bashhist.h $(DEFSRC)/common.h pathnames.h
> -+ builtins/evalstring.o: ${DEFDIR}/builtext.h
> -  builtins/getopt.o: config.h ${BASHINCDIR}/memalloc.h
> -  builtins/getopt.o: shell.h syntax.h bashjmp.h command.h general.h xmalloc.h error.h
> -
> -*** ../bash-5.1-patched/builtins/Makefile.in	2019-07-25 08:03:45.000000000 -0400
> ---- builtins/Makefile.in	2020-12-16 11:29:29.000000000 -0500
> -***************
> -*** 362,366 ****
> -  evalstring.o: $(topdir)/flags.h $(topdir)/input.h $(topdir)/execute_cmd.h
> -  evalstring.o: $(topdir)/bashhist.h $(srcdir)/common.h
> -! evalstring.o: $(topdir)/trap.h $(topdir)/redir.h ../pathnames.h
> -  #evalstring.o: $(topdir)/y.tab.h
> -  getopt.o: ../config.h $(BASHINCDIR)/memalloc.h
> ---- 362,366 ----
> -  evalstring.o: $(topdir)/flags.h $(topdir)/input.h $(topdir)/execute_cmd.h
> -  evalstring.o: $(topdir)/bashhist.h $(srcdir)/common.h
> -! evalstring.o: $(topdir)/trap.h $(topdir)/redir.h ../pathnames.h ./builtext.h
> -  #evalstring.o: $(topdir)/y.tab.h
> -  getopt.o: ../config.h $(BASHINCDIR)/memalloc.h
> -
> -*** ../bash-5.1/patchlevel.h	2020-06-22 14:51:03.000000000 -0400
> ---- patchlevel.h	2020-10-01 11:01:28.000000000 -0400
> -***************
> -*** 1,5 ****
> -  /* patchlevel.h -- current bash patch level */
> -  
> -! /* Copyright (C) 2001-2016 Free Software Foundation, Inc.
> -  
> -     This file is part of GNU Bash, the Bourne Again SHell.
> ---- 1,5 ----
> -  /* patchlevel.h -- current bash patch level */
> -  
> -! /* Copyright (C) 2001-2020 Free Software Foundation, Inc.
> -  
> -     This file is part of GNU Bash, the Bourne Again SHell.
> -***************
> -*** 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/bash51-002 b/src/patches/bash/bash51-002
> deleted file mode 100644
> index 8c991649a..000000000
> --- a/src/patches/bash/bash51-002
> +++ /dev/null
> @@ -1,57 +0,0 @@
> -			     BASH PATCH REPORT
> -			     =================
> -
> -Bash-Release:	5.1
> -Patch-ID:	bash51-002
> -
> -Bug-Reported-by:	oguzismailuysal@gmail.com
> -Bug-Reference-ID:	<CAH7i3LoHFUa4aSF5-AD2r80HG-p-YzD_9ZxomarZkhP8NMq63g@mail.gmail.com>
> -Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-12/msg00037.html
> -
> -Bug-Description:
> -
> -If there are no jobs, and the `-n' and `-p' options are both supplied to
> -`wait', bash can assign a value to the variable name specified with `-p'
> -instead of leaving it unset.
> -
> -Patch (apply with `patch -p0'):
> -
> -*** ../bash-5.1-patched/builtins/wait.def	2020-04-09 15:13:57.000000000 -0400
> ---- builtins/wait.def	2020-12-11 09:46:49.000000000 -0500
> -***************
> -*** 214,222 ****
> -  
> -        status = wait_for_any_job (wflags, &pstat);
> --       if (status < 0)
> -- 	status = 127;
>
  

Patch

diff --git a/lfs/bash b/lfs/bash
index 7b0baccad..1bf3eb2ec 100644
--- a/lfs/bash
+++ b/lfs/bash
@@ -24,7 +24,7 @@ 
 
 include Config
 
-VER        = 5.1
+VER        = 5.1.8
 
 THISAPP    = bash-$(VER)
 DL_FILE    = $(THISAPP).tar.gz
@@ -53,7 +53,7 @@  objects = $(DL_FILE)
 
 $(DL_FILE)             = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_MD5         = bb91a17fd6c9032c26d0b2b78b50aff5
+$(DL_FILE)_MD5         = 23eee6195b47318b9fd878e590ccb38c
 
 install : $(TARGET)
 
@@ -87,7 +87,7 @@  $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
 	sed -e "s/filename, RTLD_LAZY/filename, RTLD_NOW/" \
 		-i $(DIR_APP)/builtins/enable.def
 
-	for i in $$(seq 1 4); do \
+	for i in $$(seq 9 12); do \
 		cd $(DIR_APP) && patch -Np0 < $(DIR_SRC)/src/patches/bash/bash51-$$(printf "%03d" "$${i}") || exit 1; \
 	done
 
diff --git a/src/patches/bash/bash51-001 b/src/patches/bash/bash51-001
deleted file mode 100644
index 6f29981d2..000000000
--- a/src/patches/bash/bash51-001
+++ /dev/null
@@ -1,80 +0,0 @@ 
-			     BASH PATCH REPORT
-			     =================
-
-Bash-Release:	5.1
-Patch-ID:	bash51-001
-
-Bug-Reported-by:	Fazal Majid <fazal@majid.org>
-Bug-Reference-ID:	<DEAB7D2C-C626-450C-B2E5-281AFF2D26D4@majid.org>
-Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-12/msg00000.html
-
-Bug-Description:
-
-There is a missing dependency on a constructed file, which can cause highly
-parellel builds to fail.
-
-Patch (apply with `patch -p0'):
-
-*** ../bash-5.1-patched/Makefile.in	2020-12-04 09:51:19.000000000 -0500
---- Makefile.in	2020-12-16 11:28:36.000000000 -0500
-***************
-*** 1316,1319 ****
---- 1316,1320 ----
-  bashline.o: pcomplete.h ${BASHINCDIR}/chartypes.h input.h
-  bashline.o: ${BASHINCDIR}/shmbutil.h ${BASHINCDIR}/shmbchar.h
-+ bashline.o: ${DEFDIR}/builtext.h
-  bracecomp.o: config.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h
-  bracecomp.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h
-***************
-*** 1436,1439 ****
---- 1437,1441 ----
-  builtins/evalstring.o: jobs.h builtins.h flags.h input.h execute_cmd.h
-  builtins/evalstring.o: bashhist.h $(DEFSRC)/common.h pathnames.h
-+ builtins/evalstring.o: ${DEFDIR}/builtext.h
-  builtins/getopt.o: config.h ${BASHINCDIR}/memalloc.h
-  builtins/getopt.o: shell.h syntax.h bashjmp.h command.h general.h xmalloc.h error.h
-
-*** ../bash-5.1-patched/builtins/Makefile.in	2019-07-25 08:03:45.000000000 -0400
---- builtins/Makefile.in	2020-12-16 11:29:29.000000000 -0500
-***************
-*** 362,366 ****
-  evalstring.o: $(topdir)/flags.h $(topdir)/input.h $(topdir)/execute_cmd.h
-  evalstring.o: $(topdir)/bashhist.h $(srcdir)/common.h
-! evalstring.o: $(topdir)/trap.h $(topdir)/redir.h ../pathnames.h
-  #evalstring.o: $(topdir)/y.tab.h
-  getopt.o: ../config.h $(BASHINCDIR)/memalloc.h
---- 362,366 ----
-  evalstring.o: $(topdir)/flags.h $(topdir)/input.h $(topdir)/execute_cmd.h
-  evalstring.o: $(topdir)/bashhist.h $(srcdir)/common.h
-! evalstring.o: $(topdir)/trap.h $(topdir)/redir.h ../pathnames.h ./builtext.h
-  #evalstring.o: $(topdir)/y.tab.h
-  getopt.o: ../config.h $(BASHINCDIR)/memalloc.h
-
-*** ../bash-5.1/patchlevel.h	2020-06-22 14:51:03.000000000 -0400
---- patchlevel.h	2020-10-01 11:01:28.000000000 -0400
-***************
-*** 1,5 ****
-  /* patchlevel.h -- current bash patch level */
-  
-! /* Copyright (C) 2001-2016 Free Software Foundation, Inc.
-  
-     This file is part of GNU Bash, the Bourne Again SHell.
---- 1,5 ----
-  /* patchlevel.h -- current bash patch level */
-  
-! /* Copyright (C) 2001-2020 Free Software Foundation, Inc.
-  
-     This file is part of GNU Bash, the Bourne Again SHell.
-***************
-*** 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/bash51-002 b/src/patches/bash/bash51-002
deleted file mode 100644
index 8c991649a..000000000
--- a/src/patches/bash/bash51-002
+++ /dev/null
@@ -1,57 +0,0 @@ 
-			     BASH PATCH REPORT
-			     =================
-
-Bash-Release:	5.1
-Patch-ID:	bash51-002
-
-Bug-Reported-by:	oguzismailuysal@gmail.com
-Bug-Reference-ID:	<CAH7i3LoHFUa4aSF5-AD2r80HG-p-YzD_9ZxomarZkhP8NMq63g@mail.gmail.com>
-Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-12/msg00037.html
-
-Bug-Description:
-
-If there are no jobs, and the `-n' and `-p' options are both supplied to
-`wait', bash can assign a value to the variable name specified with `-p'
-instead of leaving it unset.
-
-Patch (apply with `patch -p0'):
-
-*** ../bash-5.1-patched/builtins/wait.def	2020-04-09 15:13:57.000000000 -0400
---- builtins/wait.def	2020-12-11 09:46:49.000000000 -0500
-***************
-*** 214,222 ****
-  
-        status = wait_for_any_job (wflags, &pstat);
--       if (status < 0)
-- 	status = 127;
-- 
-        if (vname && status >= 0)
-  	bind_var_to_int (vname, pstat.pid);
-        if (list)
-  	unset_waitlist ();
---- 214,222 ----
-  
-        status = wait_for_any_job (wflags, &pstat);
-        if (vname && status >= 0)
-  	bind_var_to_int (vname, pstat.pid);
-+ 
-+       if (status < 0)
-+ 	status = 127;
-        if (list)
-  	unset_waitlist ();
-
-*** ../bash-5.1/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/bash51-003 b/src/patches/bash/bash51-003
deleted file mode 100644
index 68e5dce6a..000000000
--- a/src/patches/bash/bash51-003
+++ /dev/null
@@ -1,53 +0,0 @@ 
-			     BASH PATCH REPORT
-			     =================
-
-Bash-Release:	5.1
-Patch-ID:	bash51-003
-
-Bug-Reported-by:	oguzismailuysal@gmail.com
-Bug-Reference-ID:	<CAH7i3LpG91BnNcDtaTUm2Ph7a+PnJkuh6nAc87cVL7_38tOaMQ@mail.gmail.com>
-Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-12/msg00050.html
-
-Bug-Description:
-
-Bash does not put a command substitution process that is started to perform an
-expansion in a child process into the right process group where it can receive
-keyboard-generated signals.
-
-Patch (apply with `patch -p0'):
-
-*** ../bash-5.1-patched/subst.c	2020-11-16 10:33:15.000000000 -0500
---- subst.c	2020-12-12 13:50:11.000000000 -0500
-***************
-*** 6357,6362 ****
-  #if defined (JOB_CONTROL)
-    old_pipeline_pgrp = pipeline_pgrp;
-!   /* Don't reset the pipeline pgrp if we're already a subshell in a pipeline. */
-!   if ((subshell_environment & SUBSHELL_PIPE) == 0)
-      pipeline_pgrp = shell_pgrp;
-    cleanup_the_pipeline ();
---- 6357,6364 ----
-  #if defined (JOB_CONTROL)
-    old_pipeline_pgrp = pipeline_pgrp;
-!   /* Don't reset the pipeline pgrp if we're already a subshell in a pipeline or
-!      we've already forked to run a disk command (and are expanding redirections,
-!      for example). */
-!   if ((subshell_environment & (SUBSHELL_FORK|SUBSHELL_PIPE)) == 0)
-      pipeline_pgrp = shell_pgrp;
-    cleanup_the_pipeline ();
-
-*** ../bash-5.1/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/bash51-004 b/src/patches/bash/bash51-004
deleted file mode 100644
index 39a6c647f..000000000
--- a/src/patches/bash/bash51-004
+++ /dev/null
@@ -1,126 +0,0 @@ 
-			     BASH PATCH REPORT
-			     =================
-
-Bash-Release:	5.1
-Patch-ID:	bash51-004
-
-Bug-Reported-by:	oguzismailuysal@gmail.com
-Bug-Reference-ID:	<CAH7i3LoHGmwaghDpCWRUfcY04gQmeDTH3RiG=bf2b=KbU=gyhw@mail.gmail.com>
-Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-12/msg00039.html
-
-Bug-Description:
-
-If a key-value compound array assignment to an associative array is supplied
-as an assignment statement argument to the `declare' command that declares the
-array, the assignment doesn't perform the correct word expansions.
-
-This patch makes key-value assignment and subscript assignment perform the
-same expansions when they're supplied as an argument to `declare'.
-
-Patch (apply with `patch -p0'):
-
-*** ../bash-5.1-patched/arrayfunc.c	2020-10-09 11:38:58.000000000 -0400
---- arrayfunc.c	2020-12-11 15:12:22.000000000 -0500
-***************
-*** 598,601 ****
---- 598,622 ----
-      }
-  }
-+ 
-+ /* Return non-zero if L appears to be a key-value pair associative array
-+    compound assignment. */ 
-+ int
-+ kvpair_assignment_p (l)
-+      WORD_LIST *l;
-+ {
-+   return (l && (l->word->flags & W_ASSIGNMENT) == 0 && l->word->word[0] != '[');	/*]*/
-+ }
-+ 
-+ char *
-+ expand_and_quote_kvpair_word (w)
-+      char *w;
-+ {
-+   char *t, *r;
-+ 
-+   t = w ? expand_assignment_string_to_string (w, 0) : 0;
-+   r = sh_single_quote (t ? t : "");
-+   free (t);
-+   return r;
-+ }
-  #endif
-       
-***************
-*** 641,645 ****
-  
-  #if ASSOC_KVPAIR_ASSIGNMENT
-!   if (assoc_p (var) && nlist && (nlist->word->flags & W_ASSIGNMENT) == 0 && nlist->word->word[0] != '[')	/*]*/
-      {
-        iflags = flags & ~ASS_APPEND;
---- 662,666 ----
-  
-  #if ASSOC_KVPAIR_ASSIGNMENT
-!   if (assoc_p (var) && kvpair_assignment_p (nlist))
-      {
-        iflags = flags & ~ASS_APPEND;
-*** ../bash-5.1-patched/arrayfunc.h	2020-04-29 17:24:15.000000000 -0400
---- arrayfunc.h	2020-12-11 14:23:50.000000000 -0500
-***************
-*** 68,71 ****
---- 68,74 ----
-  extern void quote_compound_array_list PARAMS((WORD_LIST *, int));
-  
-+ extern int kvpair_assignment_p PARAMS((WORD_LIST *));
-+ extern char *expand_and_quote_kvpair_word PARAMS((char *));
-+ 
-  extern int unbind_array_element PARAMS((SHELL_VAR *, char *, int));
-  extern int skipsubscript PARAMS((const char *, int, int));
-*** ../bash-5.1-patched/subst.c	2020-11-16 10:33:15.000000000 -0500
---- subst.c	2020-12-11 15:11:10.000000000 -0500
-***************
-*** 11605,11608 ****
---- 11605,11609 ----
-    WORD_LIST *l, *nl;
-    char *t;
-+   int kvpair;
-    
-    if (flags == 0)
-***************
-*** 11619,11622 ****
---- 11620,11627 ----
-        /* Associative array */
-        l = parse_string_to_word_list (value, 1, "array assign");
-+ #if ASSOC_KVPAIR_ASSIGNMENT
-+       kvpair = kvpair_assignment_p (l);
-+ #endif
-+ 
-        /* For associative arrays, with their arbitrary subscripts, we have to
-  	 expand and quote in one step so we don't have to search for the
-***************
-*** 11624,11627 ****
---- 11629,11638 ----
-        for (nl = l; nl; nl = nl->next)
-  	{
-+ #if ASSOC_KVPAIR_ASSIGNMENT
-+ 	  if (kvpair)
-+ 	    /* keys and values undergo the same set of expansions */
-+ 	    t = expand_and_quote_kvpair_word (nl->word->word);
-+ 	  else
-+ #endif
-  	  if ((nl->word->flags & W_ASSIGNMENT) == 0)
-  	    t = sh_single_quote (nl->word->word ? nl->word->word : "");
-
-*** ../bash-5.1/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/bash51-009 b/src/patches/bash/bash51-009
new file mode 100644
index 000000000..2796c3b9b
--- /dev/null
+++ b/src/patches/bash/bash51-009
@@ -0,0 +1,59 @@ 
+			     BASH PATCH REPORT
+			     =================
+
+Bash-Release:	5.1
+Patch-ID:	bash51-009
+
+Bug-Reported-by:	Julien Moutinho <julm+bash@sourcephile.fr>
+Bug-Reference-ID:	<20211004035906.5kiobuzkpeckmvwg@sourcephile.fr>
+Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2021-10/msg00022.html
+
+Bug-Description:
+
+The bash malloc implementation of malloc_usable_size() does not follow the
+specification. This can cause library functions that use it to overwrite
+memory bounds checking.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.1-patched/lib/malloc/malloc.c	2020-07-08 10:19:30.000000000 -0400
+--- lib/malloc/malloc.c	2021-10-05 16:10:55.000000000 -0400
+***************
+*** 1287,1297 ****
+      }
+  
+!   /* XXX - should we return 0 if ISFREE? */
+!   maxbytes = binsize(p->mh_index);
+! 
+!   /* So the usable size is the maximum number of bytes in the bin less the
+!      malloc overhead */
+!   maxbytes -= MOVERHEAD + MSLOP;
+!   return (maxbytes);
+  }
+  
+--- 1358,1367 ----
+      }
+  
+!   /* return 0 if ISFREE */
+!   if (p->mh_alloc == ISFREE)
+!     return 0;
+!   
+!   /* Since we use bounds checking, the usable size is the last requested size. */
+!   return (p->mh_nbytes);
+  }
+  
+*** ../bash-5.1/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_ */
diff --git a/src/patches/bash/bash51-010 b/src/patches/bash/bash51-010
new file mode 100644
index 000000000..cfe6fa46b
--- /dev/null
+++ b/src/patches/bash/bash51-010
@@ -0,0 +1,59 @@ 
+			     BASH PATCH REPORT
+			     =================
+
+Bash-Release:	5.1
+Patch-ID:	bash51-010
+
+Bug-Reported-by:	Jonas Alfredsson <jonas.alfredsson@protonmail.com>
+Bug-Reference-ID:	<LjAfZaEuZncr2RaqhSSfcaiXdkuK6kdEYxshP3LApXbgMVQzggMGyWHO9knVkXicW2fP-ibsipJ_GZ-YaJRm96Rsozf6PgFmPsljRCtflls=@protonmail.com>
+Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2021-05/msg00059.html
+
+Bug-Description:
+
+If `wait -n' is interrupted by a trapped signal other than SIGINT, it does
+not completely clean up state, and that can prevent subsequent calls to
+`wait -n' from working correctly.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.1-patched/builtins/wait.def	2020-12-16 17:13:12.000000000 -0500
+--- builtins/wait.def	2021-11-17 10:25:15.000000000 -0500
+***************
+*** 112,116 ****
+       WORD_LIST *list;
+  {
+!   int status, code, opt, nflag, wflags;
+    char *vname;
+    SHELL_VAR *pidvar;
+--- 112,117 ----
+       WORD_LIST *list;
+  {
+!   int status, code, opt, nflag;
+!   volatile int wflags;
+    char *vname;
+    SHELL_VAR *pidvar;
+***************
+*** 181,184 ****
+--- 188,193 ----
+        status = 128 + wait_signal_received;
+        wait_sigint_cleanup ();
++       if (wflags & JWAIT_WAITING)
++ 	unset_waitlist ();
+        WAIT_RETURN (status);
+      }
+
+*** ../bash-5.1/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 9
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 10
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash51-011 b/src/patches/bash/bash51-011
new file mode 100644
index 000000000..655c7ec8b
--- /dev/null
+++ b/src/patches/bash/bash51-011
@@ -0,0 +1,81 @@ 
+			     BASH PATCH REPORT
+			     =================
+
+Bash-Release:	5.1
+Patch-ID:	bash51-011
+
+Bug-Reported-by:	Alex fxmbsw7 Ratchev <fxmbsw7@gmail.com>
+Bug-Reference-ID:	<CAALKErFrm+yuwy=ioK+RmjCiwxTDmzeMFWqLF2BEWYtkGS5UFQ@mail.gmail.com>
+Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-11/msg00064.html
+
+Bug-Description:
+
+When reading a compound assignment, and running it through the parser to
+split it into words, we need to save and restore any alias we're currently
+expanding.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-5.1-patched/parse.y	2020-11-28 12:10:06.000000000 -0500
+--- parse.y	2021-10-13 11:04:27.000000000 -0400
+***************
+*** 6494,6501 ****
+  
+    push_stream (1);
+- #if 0 /* TAG: bash-5.2 Alex fxmbsw7 Ratchev <fxmbsw7@gmail.com> 11/17/2020 */
+    if (ea = expanding_alias ())
+      parser_save_alias ();
+- #endif
+    last_read_token = WORD;		/* WORD to allow reserved words here */
+    current_command_line_count = 0;
+--- 6494,6499 ----
+***************
+*** 6532,6539 ****
+    pop_stream ();
+  
+- #if 0 /* TAG: bash-5.2 */
+    if (ea)
+      parser_restore_alias ();
+- #endif
+  
+  #if defined (HISTORY)
+--- 6530,6535 ----
+*** ../bash-5.1-patched/y.tab.c	2020-11-28 12:17:19.000000000 -0500
+--- y.tab.c	2021-11-17 10:47:35.000000000 -0500
+***************
+*** 8788,8795 ****
+  
+    push_stream (1);
+- #if 0 /* TAG: bash-5.2 Alex fxmbsw7 Ratchev <fxmbsw7@gmail.com> 11/17/2020 */
+    if (ea = expanding_alias ())
+      parser_save_alias ();
+- #endif
+    last_read_token = WORD;		/* WORD to allow reserved words here */
+    current_command_line_count = 0;
+--- 8777,8782 ----
+***************
+*** 8826,8833 ****
+    pop_stream ();
+  
+- #if 0 /* TAG: bash-5.2 */
+    if (ea)
+      parser_restore_alias ();
+- #endif
+  
+  #if defined (HISTORY)
+--- 8813,8818 ----
+*** ../bash-5.1/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 10
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 11
+  
+  #endif /* _PATCHLEVEL_H_ */
diff --git a/src/patches/bash/bash51-012 b/src/patches/bash/bash51-012
new file mode 100644
index 000000000..222491884
--- /dev/null
+++ b/src/patches/bash/bash51-012
@@ -0,0 +1,198 @@ 
+			     BASH PATCH REPORT
+			     =================
+
+Bash-Release:	5.1
+Patch-ID:	bash51-012
+
+Bug-Reported-by:	Nikolay Borisov <nborisov@suse.com>
+Bug-Reference-ID:	<1a715205-06ce-413b-c1c0-2f5639ce06c0@suse.com>
+Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2020-11/msg00091.html
+
+Bug-Description:
+
+There is a possible race condition that arises when a child process receives
+a signal trapped by the parent before it can reset the signal dispositions.
+The child process is not supposed to trap the signal in this circumstance.
+
+Patch (apply with `patch -p0'):
+
+*** ../bash-20201118/command.h	2020-08-14 15:04:39.000000000 -0400
+--- command.h	2020-11-27 15:18:02.000000000 -0500
+***************
+*** 125,128 ****
+--- 125,129 ----
+  #define SUBSHELL_COPROC	0x40	/* subshell from a coproc pipeline */
+  #define SUBSHELL_RESETTRAP 0x80	/* subshell needs to reset trap strings on first call to trap */
++ #define SUBSHELL_IGNTRAP 0x100  /* subshell should reset trapped signals from trap_handler */
+  
+  /* A structure which represents a word. */
+
+*** ../bash-20201118/execute_cmd.c	2020-11-23 14:16:48.000000000 -0500
+--- execute_cmd.c	2020-11-27 16:43:25.000000000 -0500
+***************
+*** 1548,1551 ****
+--- 1548,1554 ----
+    reset_signal_handlers ();
+    subshell_environment |= SUBSHELL_RESETTRAP;
++   /* Note that signal handlers have been reset, so we should no longer
++     reset the handler and resend trapped signals to ourselves. */
++   subshell_environment &= ~SUBSHELL_IGNTRAP;
+  
+    /* We are in a subshell, so forget that we are running a trap handler or
+***************
+*** 4321,4325 ****
+  	  cmdflags |= CMD_NO_FORK;
+  
+! 	  subshell_environment = SUBSHELL_FORK;		/* XXX */
+  	  if (pipe_in != NO_PIPE || pipe_out != NO_PIPE)
+  	    subshell_environment |= SUBSHELL_PIPE;
+--- 4324,4329 ----
+  	  cmdflags |= CMD_NO_FORK;
+  
+! 	  /* We redo some of what make_child() does with SUBSHELL_IGNTRAP */
+! 	  subshell_environment = SUBSHELL_FORK|SUBSHELL_IGNTRAP;	/* XXX */
+  	  if (pipe_in != NO_PIPE || pipe_out != NO_PIPE)
+  	    subshell_environment |= SUBSHELL_PIPE;
+***************
+*** 4575,4578 ****
+--- 4580,4584 ----
+  	  reset_signal_handlers ();
+  	  subshell_environment |= SUBSHELL_RESETTRAP;
++ 	  subshell_environment &= ~SUBSHELL_IGNTRAP;
+  
+  	  if (async)
+***************
+*** 5515,5518 ****
+--- 5521,5525 ----
+        /* Cancel traps, in trap.c. */
+        restore_original_signals ();
++       subshell_environment &= ~SUBSHELL_IGNTRAP;
+  
+  #if defined (JOB_CONTROL)
+
+*** ../bash-20201118/jobs.c	2020-08-04 10:17:39.000000000 -0400
+--- jobs.c	2020-11-27 16:39:56.000000000 -0500
+***************
+*** 2218,2221 ****
+--- 2218,2223 ----
+        pid_t mypid;
+  
++       subshell_environment |= SUBSHELL_IGNTRAP;
++ 
+        /* If this ends up being changed to modify or use `command' in the
+  	 child process, go back and change callers who free `command' in
+diff -rC 2 ../bash-20201118/nojobs.c nojobs.c
+*** ../bash-20201118/nojobs.c	2020-07-08 10:11:25.000000000 -0400
+--- nojobs.c	2020-11-27 16:38:36.000000000 -0500
+***************
+*** 576,579 ****
+--- 576,581 ----
+  #endif
+  
++       subshell_environment |= SUBSHELL_IGNTRAP;
++ 
+        default_tty_job_signals ();
+      }
+
+*** ../bash-20201118/sig.c	2020-11-23 13:22:17.000000000 -0500
+--- sig.c	2020-11-28 10:21:43.000000000 -0500
+***************
+*** 56,60 ****
+  #endif
+  
+! extern void initialize_siglist ();
+  
+  #if !defined (JOB_CONTROL)
+--- 56,61 ----
+  #endif
+  
+! extern void initialize_siglist PARAMS((void));
+! extern void set_original_signal PARAMS((int, SigHandler *));
+  
+  #if !defined (JOB_CONTROL)
+***************
+*** 256,259 ****
+--- 257,267 ----
+        XHANDLER(i) = oact.sa_handler;
+        XSAFLAGS(i) = oact.sa_flags;
++ 
++ #if 0
++       set_original_signal (XSIG(i), XHANDLER(i));	/* optimization */
++ #else
++       set_original_signal (XSIG(i), act.sa_handler);	/* optimization */
++ #endif
++ 
+        /* Don't do anything with signals that are ignored at shell entry
+  	 if the shell is not interactive. */
+
+*** ../bash-20201118/subst.c	2020-11-16 10:33:15.000000000 -0500
+--- subst.c	2020-11-27 16:07:00.000000000 -0500
+***************
+*** 5952,5955 ****
+--- 5952,5956 ----
+        /* Cancel traps, in trap.c. */
+        restore_original_signals ();	/* XXX - what about special builtins? bash-4.2 */
++       subshell_environment &= ~SUBSHELL_IGNTRAP;
+        QUIT;	/* catch any interrupts we got post-fork */
+        setup_async_signals ();
+***************
+*** 6383,6386 ****
+--- 6384,6388 ----
+        QUIT;	/* catch any interrupts we got post-fork */
+        subshell_environment |= SUBSHELL_RESETTRAP;
++       subshell_environment &= ~SUBSHELL_IGNTRAP;
+      }
+  
+
+diff -rC 2 ../bash-20201118/trap.c trap.c
+*** ../bash-20201118/trap.c	2020-11-28 12:04:07.000000000 -0500
+--- trap.c	2020-11-28 10:22:10.000000000 -0500
+***************
+*** 482,485 ****
+--- 482,511 ----
+      }
+  
++   /* This means we're in a subshell, but have not yet reset the handler for
++      trapped signals. We're not supposed to execute the trap in this situation;
++      we should restore the original signal and resend the signal to ourselves
++      to preserve the Posix "signal traps that are not being ignored shall be
++      set to the default action" semantics. */
++   if ((subshell_environment & SUBSHELL_IGNTRAP) && trap_list[sig] != (char *)IGNORE_SIG)
++     {
++       sigset_t mask;
++ 
++       /* Paranoia */
++       if (original_signals[sig] == IMPOSSIBLE_TRAP_HANDLER)
++ 	original_signals[sig] = SIG_DFL;
++ 
++       restore_signal (sig);
++ 
++       /* Make sure we let the signal we just caught through */
++       sigemptyset (&mask);
++       sigprocmask (SIG_SETMASK, (sigset_t *)NULL, &mask);
++       sigdelset (&mask, sig);
++       sigprocmask (SIG_SETMASK, &mask, (sigset_t *)NULL);
++ 
++       kill (getpid (), sig);
++ 
++       SIGRETURN (0);
++     }
++ 
+    if ((sig >= NSIG) ||
+        (trap_list[sig] == (char *)DEFAULT_SIG) ||
+
+*** ../bash-5.1/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 11
+  
+  #endif /* _PATCHLEVEL_H_ */
+--- 26,30 ----
+     looks for to find the patch level (for the sccs version string). */
+  
+! #define PATCHLEVEL 12
+  
+  #endif /* _PATCHLEVEL_H_ */