!79 [sync] PR-78: bash高版本社区补丁主动回合

From: @openeuler-sync-bot 
Reviewed-by: @overweight 
Signed-off-by: @overweight
This commit is contained in:
openeuler-ci-bot 2023-01-17 06:18:43 +00:00 committed by Gitee
commit 0e625416ce
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
6 changed files with 378 additions and 2 deletions

View File

@ -0,0 +1,38 @@
From 910fcdc415abeb3d7d85fb46ee0d3e804a4c47a6 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
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
Conflict:NA
Reference:https://git.savannah.gnu.org/cgit/bash.git/commit/?id=910fcdc415abeb3d7d85fb46ee0d3e804a4c47a6
---
builtins/wait.def | 5 ++++-
1 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);
}
--
2.33.0

View File

@ -0,0 +1,68 @@
From c839339fbfd2bb7ee4a523b64c7f3734ba36b9bc Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
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
Conflict:NA
Reference:https://git.savannah.gnu.org/cgit/bash.git/commit/?id=c839339fbfd2bb7ee4a523b64c7f3734ba36b9bc
---
parse.y | 4 ----
y.tab.c | 4 ----
2 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 <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;
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/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 <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;
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.33.0

View File

@ -0,0 +1,184 @@
From 15409324f1974d41c183904ad575da7188058c1c Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
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
Conflict:NA
Reference:https://git.savannah.gnu.org/cgit/bash.git/commit/?id=15409324f1974d41c183904ad575da7188058c1c
---
command.h | 1 +
execute_cmd.c | 8 +++++++-
jobs.c | 2 ++
nojobs.c | 2 ++
sig.c | 10 +++++++++-
subst.c | 2 ++
trap.c | 26 ++++++++++++++++++++++++++
7 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/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.33.0

View File

@ -0,0 +1,28 @@
From 18ad612ea80ba978ae8271800814737e224a4baf Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Tue, 4 Jan 2022 17:01:33 -0500
Subject: [PATCH] Bash-5.1 patch 15: fix readline display of some characters >
128 in certain single-byte encodings
Conflict:NA
Reference:https://git.savannah.gnu.org/cgit/bash.git/commit/?id=18ad612ea80ba978ae8271800814737e224a4baf
---
lib/readline/display.c | 2 +-
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/readline/display.c b/lib/readline/display.c
index 38b3d0e7..f5d32945 100644
--- a/lib/readline/display.c
+++ b/lib/readline/display.c
@@ -1598,7 +1598,7 @@ puts_face (const char *str, const char *face, int n)
char cur_face;
for (cur_face = FACE_NORMAL, i = 0; i < n; i++)
- putc_face (str[i], face[i], &cur_face);
+ putc_face ((unsigned char) str[i], face[i], &cur_face);
putc_face (EOF, FACE_NORMAL, &cur_face);
}
--
2.33.0

View File

@ -0,0 +1,42 @@
From 9439ce094c9aa7557a9d53ac7b412a23aa66e36b Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Tue, 4 Jan 2022 17:03:45 -0500
Subject: [PATCH] Bash-5.1 patch 16: fix interpretation of multiple instances
of ! in [[ conditional commands
Conflict:NA
Reference:https://git.savannah.gnu.org/cgit/bash.git/commit/?id=9439ce094c9aa7557a9d53ac7b412a23aa66e36b
---
parse.y | 2 +-
y.tab.c | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/parse.y b/parse.y
index f25575b5..f4168c7c 100644
--- a/parse.y
+++ b/parse.y
@@ -4796,7 +4796,7 @@ cond_term ()
dispose_word (yylval.word); /* not needed */
term = cond_term ();
if (term)
- term->flags |= CMD_INVERT_RETURN;
+ term->flags ^= CMD_INVERT_RETURN;
}
else if (tok == WORD && yylval.word->word[0] == '-' && yylval.word->word[1] && yylval.word->word[2] == 0 && test_unop (yylval.word->word))
{
diff --git a/y.tab.c b/y.tab.c
index c11d7aaa..78b38250 100644
--- a/y.tab.c
+++ b/y.tab.c
@@ -7090,7 +7090,7 @@ cond_term ()
dispose_word (yylval.word); /* not needed */
term = cond_term ();
if (term)
- term->flags |= CMD_INVERT_RETURN;
+ term->flags ^= CMD_INVERT_RETURN;
}
else if (tok == WORD && yylval.word->word[0] == '-' && yylval.word->word[1] && yylval.word->word[2] == 0 && test_unop (yylval.word->word))
{
--
2.33.0

View File

@ -1,6 +1,6 @@
Name: bash
Version: 5.1.8
Release: 6
Release: 7
Summary: It is the Bourne Again Shell
License: GPLv3
URL: https://www.gnu.org/software/bash
@ -27,6 +27,12 @@ Patch140: bash-5.1-sw.patch
Patch141: backport-fix-crash-in-readline-when-started-with-an-invalid.patch
Patch142: backport-fix-CVE-2022-3715.patch
Patch6001: backport-Bash-5.1-patch-10-fix-for-wait-n-being-interrupted-b.patch
Patch6002: backport-Bash-5.1-patch-11-save-and-restore-alias-parsing-whe.patch
Patch6003: backport-Bash-5.1-patch-12-fix-race-condition-with-child-proc.patch
Patch6004: backport-Bash-5.1-patch-15-fix-readline-display-of-some-chara.patch
Patch6005: backport-Bash-5.1-patch-16-fix-interpretation-of-multiple-ins.patch
BuildRequires: gcc bison texinfo autoconf ncurses-devel
# Required for bash tests
BuildRequires: glibc-all-langpacks
@ -119,7 +125,17 @@ make check
%exclude %{_infodir}/dir
%changelog
* Thu Nov 10 2022 wangyuhang <wangyuhang27@h-partners.com> -5.1.8-6
* Mon Jan 16 2023 wangyuhang <wangyuhang27@huawei.com> -5.1.8-7
- Type:bugfix
- ID:NA
- SUG:NA
- DESC: add backport-Bash-5.1-patch-10-fix-for-wait-n-being-interrupted-b.patch
backport-Bash-5.1-patch-11-save-and-restore-alias-parsing-whe.patch
backport-Bash-5.1-patch-12-fix-race-condition-with-child-proc.patch
backport-Bash-5.1-patch-15-fix-readline-display-of-some-chara.patch
backport-Bash-5.1-patch-16-fix-interpretation-of-multiple-ins.patch
* Thu Nov 10 2022 wangyuhang <wangyuhang27@huawei.com> -5.1.8-6
- Type:CVE
- ID:NA
- SUG:NA