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