From 667315bd13655c4d98f76a1f35a92aca5dd1e5b0 Mon Sep 17 00:00:00 2001 From: Siteshwar Vashisht Date: Fri, 26 Nov 2021 16:53:48 +0100 Subject: [PATCH] Update to bash-5.1 patchlevel 12 --- bash-5.1-patch-10.patch | 49 ++++++++++ bash-5.1-patch-11.patch | 79 ++++++++++++++++ bash-5.1-patch-12.patch | 195 ++++++++++++++++++++++++++++++++++++++++ bash-5.1-patch-9.patch | 50 +++++++++++ bash.spec | 9 +- 5 files changed, 379 insertions(+), 3 deletions(-) create mode 100644 bash-5.1-patch-10.patch create mode 100644 bash-5.1-patch-11.patch create mode 100644 bash-5.1-patch-12.patch create mode 100644 bash-5.1-patch-9.patch diff --git a/bash-5.1-patch-10.patch b/bash-5.1-patch-10.patch new file mode 100644 index 0000000..ff235be --- /dev/null +++ b/bash-5.1-patch-10.patch @@ -0,0 +1,49 @@ +From 910fcdc415abeb3d7d85fb46ee0d3e804a4c47a6 Mon Sep 17 00:00:00 2001 +From: Chet Ramey +Date: Wed, 17 Nov 2021 16:45:23 -0500 +Subject: [PATCH] Bash-5.1 patch 10: fix for wait -n being interrupted by a + trapped signal + +--- + builtins/wait.def | 5 ++++- + patchlevel.h | 2 +- + 2 files changed, 5 insertions(+), 2 deletions(-) + +diff --git a/builtins/wait.def b/builtins/wait.def +index 824c83fe..e70a4d94 100644 +--- a/builtins/wait.def ++++ b/builtins/wait.def +@@ -111,7 +111,8 @@ int + wait_builtin (list) + WORD_LIST *list; + { +- int status, code, opt, nflag, wflags; ++ int status, code, opt, nflag; ++ volatile int wflags; + char *vname; + SHELL_VAR *pidvar; + struct procstat pstat; +@@ -180,6 +181,8 @@ wait_builtin (list) + last_command_exit_signal = wait_signal_received; + status = 128 + wait_signal_received; + wait_sigint_cleanup (); ++ if (wflags & JWAIT_WAITING) ++ unset_waitlist (); + WAIT_RETURN (status); + } + +diff --git a/patchlevel.h b/patchlevel.h +index 17586ff7..75246e44 100644 +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 9 ++#define PATCHLEVEL 10 + + #endif /* _PATCHLEVEL_H_ */ +-- +2.31.1 + diff --git a/bash-5.1-patch-11.patch b/bash-5.1-patch-11.patch new file mode 100644 index 0000000..ec171ec --- /dev/null +++ b/bash-5.1-patch-11.patch @@ -0,0 +1,79 @@ +From c839339fbfd2bb7ee4a523b64c7f3734ba36b9bc Mon Sep 17 00:00:00 2001 +From: Chet Ramey +Date: Wed, 17 Nov 2021 16:46:40 -0500 +Subject: [PATCH] Bash-5.1 patch 11: save and restore alias parsing when + performing compound array assignment + +--- + parse.y | 4 ---- + patchlevel.h | 2 +- + y.tab.c | 4 ---- + 3 files changed, 1 insertion(+), 9 deletions(-) + +diff --git a/parse.y b/parse.y +index df1231da..f25575b5 100644 +--- a/parse.y ++++ b/parse.y +@@ -6493,10 +6493,8 @@ parse_string_to_word_list (s, flags, whom) + old_expand_aliases = expand_aliases; + + push_stream (1); +-#if 0 /* TAG: bash-5.2 Alex fxmbsw7 Ratchev 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; + echo_input_at_read = expand_aliases = 0; +@@ -6531,10 +6529,8 @@ parse_string_to_word_list (s, flags, whom) + last_read_token = '\n'; + pop_stream (); + +-#if 0 /* TAG: bash-5.2 */ + if (ea) + parser_restore_alias (); +-#endif + + #if defined (HISTORY) + remember_on_history = old_remember_on_history; +diff --git a/patchlevel.h b/patchlevel.h +index 75246e44..8b14f289 100644 +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 10 ++#define PATCHLEVEL 11 + + #endif /* _PATCHLEVEL_H_ */ +diff --git a/y.tab.c b/y.tab.c +index dcc5b7f3..c11d7aaa 100644 +--- a/y.tab.c ++++ b/y.tab.c +@@ -8787,10 +8787,8 @@ parse_string_to_word_list (s, flags, whom) + old_expand_aliases = expand_aliases; + + push_stream (1); +-#if 0 /* TAG: bash-5.2 Alex fxmbsw7 Ratchev 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; + echo_input_at_read = expand_aliases = 0; +@@ -8825,10 +8823,8 @@ parse_string_to_word_list (s, flags, whom) + last_read_token = '\n'; + pop_stream (); + +-#if 0 /* TAG: bash-5.2 */ + if (ea) + parser_restore_alias (); +-#endif + + #if defined (HISTORY) + remember_on_history = old_remember_on_history; +-- +2.31.1 + diff --git a/bash-5.1-patch-12.patch b/bash-5.1-patch-12.patch new file mode 100644 index 0000000..3cc737f --- /dev/null +++ b/bash-5.1-patch-12.patch @@ -0,0 +1,195 @@ +From 15409324f1974d41c183904ad575da7188058c1c Mon Sep 17 00:00:00 2001 +From: Chet Ramey +Date: Wed, 17 Nov 2021 16:47:24 -0500 +Subject: [PATCH] Bash-5.1 patch 12: fix race condition with child processes + and resetting trapped signals + +--- + command.h | 1 + + execute_cmd.c | 8 +++++++- + jobs.c | 2 ++ + nojobs.c | 2 ++ + patchlevel.h | 2 +- + sig.c | 10 +++++++++- + subst.c | 2 ++ + trap.c | 26 ++++++++++++++++++++++++++ + 8 files changed, 50 insertions(+), 3 deletions(-) + +diff --git a/command.h b/command.h +index 914198f9..b8477528 100644 +--- a/command.h ++++ b/command.h +@@ -124,6 +124,7 @@ enum command_type { cm_for, cm_case, cm_while, cm_if, cm_simple, cm_select, + #define SUBSHELL_PROCSUB 0x20 /* subshell caused by <(command) or >(command) */ + #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. */ + typedef struct word_desc { +diff --git a/execute_cmd.c b/execute_cmd.c +index 90129e06..425679a2 100644 +--- a/execute_cmd.c ++++ b/execute_cmd.c +@@ -1547,6 +1547,9 @@ execute_in_subshell (command, asynchronous, pipe_in, pipe_out, fds_to_close) + clear_pending_traps (); + 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 + that the signal handler has changed (we haven't changed it!) */ +@@ -4320,7 +4323,8 @@ execute_simple_command (simple_command, pipe_in, pipe_out, async, fds_to_close) + already_forked = 1; + cmdflags |= CMD_NO_FORK; + +- subshell_environment = SUBSHELL_FORK; /* XXX */ ++ /* 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; + if (async) +@@ -4574,6 +4578,7 @@ run_builtin: + trap strings if we run trap to change a signal disposition. */ + reset_signal_handlers (); + subshell_environment |= SUBSHELL_RESETTRAP; ++ subshell_environment &= ~SUBSHELL_IGNTRAP; + + if (async) + { +@@ -5514,6 +5519,7 @@ execute_disk_command (words, redirects, command_line, pipe_in, pipe_out, + reset_terminating_signals (); /* XXX */ + /* Cancel traps, in trap.c. */ + restore_original_signals (); ++ subshell_environment &= ~SUBSHELL_IGNTRAP; + + #if defined (JOB_CONTROL) + FREE (p); +diff --git a/jobs.c b/jobs.c +index a581f305..7c3b6e83 100644 +--- a/jobs.c ++++ b/jobs.c +@@ -2217,6 +2217,8 @@ make_child (command, flags) + signals to the default state for a new process. */ + 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 + the child process when this returns. */ +diff --git a/nojobs.c b/nojobs.c +index c5fc83d9..f2563ca0 100644 +--- a/nojobs.c ++++ b/nojobs.c +@@ -575,6 +575,8 @@ make_child (command, flags) + last_asynchronous_pid = getpid (); + #endif + ++ subshell_environment |= SUBSHELL_IGNTRAP; ++ + default_tty_job_signals (); + } + else +diff --git a/patchlevel.h b/patchlevel.h +index 8b14f289..eb2aca52 100644 +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 11 ++#define PATCHLEVEL 12 + + #endif /* _PATCHLEVEL_H_ */ +diff --git a/sig.c b/sig.c +index 6964d862..e6537d26 100644 +--- a/sig.c ++++ b/sig.c +@@ -55,7 +55,8 @@ + # include "bashhist.h" + #endif + +-extern void initialize_siglist (); ++extern void initialize_siglist PARAMS((void)); ++extern void set_original_signal PARAMS((int, SigHandler *)); + + #if !defined (JOB_CONTROL) + extern void initialize_job_signals PARAMS((void)); +@@ -255,6 +256,13 @@ initialize_terminating_signals () + sigaction (XSIG (i), &act, &oact); + 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. */ + /* XXX - should we do this for interactive shells, too? */ +diff --git a/subst.c b/subst.c +index 462752de..327de083 100644 +--- a/subst.c ++++ b/subst.c +@@ -5951,6 +5951,7 @@ process_substitute (string, open_for_read_in_child) + free_pushed_string_input (); + /* 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 (); + #if 0 +@@ -6382,6 +6383,7 @@ command_substitute (string, quoted, flags) + } + QUIT; /* catch any interrupts we got post-fork */ + subshell_environment |= SUBSHELL_RESETTRAP; ++ subshell_environment &= ~SUBSHELL_IGNTRAP; + } + + #if defined (JOB_CONTROL) +diff --git a/trap.c b/trap.c +index c7f8ded5..1b27fb3a 100644 +--- a/trap.c ++++ b/trap.c +@@ -481,6 +481,32 @@ trap_handler (sig) + SIGRETURN (0); + } + ++ /* 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) || + (trap_list[sig] == (char *)IGNORE_SIG)) +-- +2.31.1 + diff --git a/bash-5.1-patch-9.patch b/bash-5.1-patch-9.patch new file mode 100644 index 0000000..0be56d0 --- /dev/null +++ b/bash-5.1-patch-9.patch @@ -0,0 +1,50 @@ +From fed42742e0b33b358610bf62c7474f55e6465205 Mon Sep 17 00:00:00 2001 +From: Chet Ramey +Date: Wed, 17 Nov 2021 16:44:19 -0500 +Subject: [PATCH] Bash-5.1 patch 9: fix bash malloc implementation of + malloc_usable_size + +--- + lib/malloc/malloc.c | 13 ++++++------- + patchlevel.h | 2 +- + 2 files changed, 7 insertions(+), 8 deletions(-) + +diff --git a/lib/malloc/malloc.c b/lib/malloc/malloc.c +index 439f8ef1..92e6efa5 100644 +--- a/lib/malloc/malloc.c ++++ b/lib/malloc/malloc.c +@@ -1286,13 +1286,12 @@ malloc_usable_size (mem) + p = (union mhead *) ap - 1; + } + +- /* 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); ++ /* 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); + } + + #if !defined (NO_VALLOC) +diff --git a/patchlevel.h b/patchlevel.h +index 10fde2ee..17586ff7 100644 +--- a/patchlevel.h ++++ b/patchlevel.h +@@ -25,6 +25,6 @@ + regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh + looks for to find the patch level (for the sccs version string). */ + +-#define PATCHLEVEL 8 ++#define PATCHLEVEL 9 + + #endif /* _PATCHLEVEL_H_ */ +-- +2.31.1 + diff --git a/bash.spec b/bash.spec index ea314c7..b60147d 100644 --- a/bash.spec +++ b/bash.spec @@ -1,12 +1,12 @@ #% define beta_tag rc2 -%define patchleveltag .8 +%define patchleveltag .12 %define baseversion 5.1 %bcond_without tests Version: %{baseversion}%{patchleveltag} Name: bash Summary: The GNU Bourne Again shell -Release: 3%{?dist} +Release: 1%{?dist} License: GPLv3+ Url: https://www.gnu.org/software/bash Source0: https://ftp.gnu.org/gnu/bash/bash-%{baseversion}.tar.gz @@ -20,7 +20,7 @@ Source3: dot-bash_logout # Official upstream patches # Patches are converted to apply with '-p1' -%{lua:for i=1,8 do print(string.format("Patch%u: bash-5.1-patch-%u.patch\n", i, i)) end} +%{lua:for i=1,12 do print(string.format("Patch%u: bash-5.1-patch-%u.patch\n", i, i)) end} # Other patches # We don't want to add '/etc:/usr/etc' in standard utils path. @@ -318,6 +318,9 @@ end %{_libdir}/pkgconfig/%{name}.pc %changelog +* Fri Nov 26 2021 Siteshwar Vashisht - 5.1.12-1 +- Update to bash-5.1 patchlevel 12 + * Fri Nov 05 2021 Siteshwar Vashisht - 5.1.8-3 - Add a runtime option to enable history logging to syslog Resolves: #2020528