- 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.
diff --git a/lfs/bash b/lfs/bash
index 7b0baccad..1bf3eb2ec 100644
--- a/lfs/bash
+++ b/lfs/bash
@@ -24,7 +24,7 @@
THISAPP = bash-$(VER)
DL_FILE = $(THISAPP).tar.gz
@@ -53,7 +53,7 @@ objects = $(DL_FILE)
-$(DL_FILE)_MD5 = bb91a17fd6c9032c26d0b2b78b50aff5
+$(DL_FILE)_MD5 = 23eee6195b47318b9fd878e590ccb38c
@@ -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