components/shell/bash/Makefile | ●●●●● patch | view | raw | blame | history | |
components/shell/bash/bash.p5m | ●●●●● patch | view | raw | blame | history | |
components/shell/bash/patches/bash51-009.patch | ●●●●● patch | view | raw | blame | history | |
components/shell/bash/patches/bash51-010.patch | ●●●●● patch | view | raw | blame | history | |
components/shell/bash/patches/bash51-011.patch | ●●●●● patch | view | raw | blame | history | |
components/shell/bash/patches/bash51-012.patch | ●●●●● patch | view | raw | blame | history |
components/shell/bash/Makefile
@@ -22,6 +22,7 @@ # # Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2020, Michal Nowak # Copyright (c) 2021, Andreas Wacknitz # BUILD_BITS= 64 @@ -45,7 +46,8 @@ ifeq ($(BASH_PATCHLEVEL),) BASH_PATCHLEVEL=0 endif IPS_COMPONENT_VERSION = $(COMPONENT_VERSION).$(BASH_PATCHLEVEL) IPS_COMPONENT_VERSION= $(COMPONENT_VERSION).$(BASH_PATCHLEVEL) HUMAN_VERSION= $(COMPONENT_VERSION).p$(BASH_PATCHLEVEL) PATCH_LEVEL = 0 PKG_PROTO_DIRS += $(COMPONENT_DIR)/files components/shell/bash/bash.p5m
@@ -29,6 +29,7 @@ set name=info.upstream-url value=$(COMPONENT_PROJECT_URL) set name=info.source-url value=$(COMPONENT_ARCHIVE_URL) set name=org.opensolaris.consolidation value=$(CONSOLIDATION) set name=pkg.human-version value=$(HUMAN_VERSION) license $(COMPONENT_LICENSE_FILE) license='$(COMPONENT_LICENSE)' components/shell/bash/patches/bash51-009.patch
New file @@ -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_ */ components/shell/bash/patches/bash51-010.patch
New file @@ -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_ */ components/shell/bash/patches/bash51-011.patch
New file @@ -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_ */ components/shell/bash/patches/bash51-012.patch
New file @@ -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_ */