blob: df92c2475d8c5dd7cb07feb8ddfb26a15df8de3d [file] [log] [blame]
From 721d5be99eb37d31e48bd66d61808a66a4c5ab84 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Mon, 30 Oct 2023 12:16:07 -0400
Subject: [PATCH] changes to SIGINT handler while waiting for a child; skip
vertical whitespace after translating an integer
Upstream-Status: Backport from
[https://git.savannah.gnu.org/cgit/bash.git/commit/?h=devel&id=fe24a6a55e8850298b496c5b9d82f1866eba190e]
[Adjust and drop some codes to be applicable the tree]
Signed-off-by: Xiangyu Chen <xiangyu.chen@windriver.com>
---
general.c | 5 +++--
jobs.c | 24 ++++++++++++++++--------
tests/redir.right | 4 ++--
tests/redir11.sub | 2 ++
tests/type.right | 16 ++++++++--------
tests/type.tests | 24 ++++++++++++------------
6 files changed, 43 insertions(+), 32 deletions(-)
diff --git a/general.c b/general.c
index 85c5a8b6..65e2ee06 100644
--- a/general.c
+++ b/general.c
@@ -262,8 +262,9 @@ legal_number (string, result)
if (errno || ep == string)
return 0; /* errno is set on overflow or underflow */
- /* Skip any trailing whitespace, since strtoimax does not. */
- while (whitespace (*ep))
+ /* Skip any trailing whitespace, since strtoimax does not, using the same
+ test that strtoimax uses for leading whitespace. */
+ while (isspace ((unsigned char) *ep))
ep++;
/* If *string is not '\0' but *ep is '\0' on return, the entire string
diff --git a/jobs.c b/jobs.c
index 6b986ed7..262d78de 100644
--- a/jobs.c
+++ b/jobs.c
@@ -2718,6 +2718,10 @@ wait_for_background_pids (ps)
#define INVALID_SIGNAL_HANDLER (SigHandler *)wait_for_background_pids
static SigHandler *old_sigint_handler = INVALID_SIGNAL_HANDLER;
+/* The current SIGINT handler as set by restore_sigint_handler. Only valid
+ immediately after restore_sigint_handler, used for continuations. */
+static SigHandler *cur_sigint_handler = INVALID_SIGNAL_HANDLER;
+
static int wait_sigint_received;
static int child_caught_sigint;
@@ -2735,6 +2739,7 @@ wait_sigint_cleanup ()
static void
restore_sigint_handler ()
{
+ cur_sigint_handler = old_sigint_handler;
if (old_sigint_handler != INVALID_SIGNAL_HANDLER)
{
set_signal_handler (SIGINT, old_sigint_handler);
@@ -2758,8 +2763,7 @@ wait_sigint_handler (sig)
restore_sigint_handler ();
/* If we got a SIGINT while in `wait', and SIGINT is trapped, do
what POSIX.2 says (see builtins/wait.def for more info). */
- if (this_shell_builtin && this_shell_builtin == wait_builtin &&
- signal_is_trapped (SIGINT) &&
+ if (signal_is_trapped (SIGINT) &&
((sigint_handler = trap_to_sighandler (SIGINT)) == trap_handler))
{
trap_handler (SIGINT); /* set pending_traps[SIGINT] */
@@ -2782,6 +2786,8 @@ wait_sigint_handler (sig)
{
set_exit_status (128+SIGINT);
restore_sigint_handler ();
+ if (cur_sigint_handler == INVALID_SIGNAL_HANDLER)
+ set_sigint_handler (); /* XXX - only do this in one place */
kill (getpid (), SIGINT);
}
@@ -2926,11 +2932,13 @@ wait_for (pid, flags)
{
SigHandler *temp_sigint_handler;
- temp_sigint_handler = set_signal_handler (SIGINT, wait_sigint_handler);
- if (temp_sigint_handler == wait_sigint_handler)
- internal_debug ("wait_for: recursively setting old_sigint_handler to wait_sigint_handler: running_trap = %d", running_trap);
- else
- old_sigint_handler = temp_sigint_handler;
+ temp_sigint_handler = old_sigint_handler;
+ old_sigint_handler = set_signal_handler (SIGINT, wait_sigint_handler);
+ if (old_sigint_handler == wait_sigint_handler)
+ {
+ internal_debug ("wait_for: recursively setting old_sigint_handler to wait_sigint_handler: running_trap = %d", running_trap);
+ old_sigint_handler = temp_sigint_handler;
+ }
waiting_for_child = 0;
if (old_sigint_handler == SIG_IGN)
set_signal_handler (SIGINT, old_sigint_handler);
@@ -4136,7 +4144,7 @@ set_job_status_and_cleanup (job)
SIGINT (if we reset the sighandler to the default).
In this case, we have to fix things up. What a crock. */
if (temp_handler == trap_handler && signal_is_trapped (SIGINT) == 0)
- temp_handler = trap_to_sighandler (SIGINT);
+ temp_handler = trap_to_sighandler (SIGINT);
restore_sigint_handler ();
if (temp_handler == SIG_DFL)
termsig_handler (SIGINT); /* XXX */
diff --git a/tests/redir.right b/tests/redir.right
index 8db10414..9e1403c8 100644
--- a/tests/redir.right
+++ b/tests/redir.right
@@ -154,10 +154,10 @@ foo
1
7
after: 42
-./redir11.sub: line 53: $(ss= declare -i ss): ambiguous redirect
+./redir11.sub: line 55: $(ss= declare -i ss): ambiguous redirect
after: 42
a+=3
foo
foo
-./redir11.sub: line 75: 42: No such file or directory
+./redir11.sub: line 77: 42: No such file or directory
42
diff --git a/tests/redir11.sub b/tests/redir11.sub
index d417cdb6..ca9854cd 100644
--- a/tests/redir11.sub
+++ b/tests/redir11.sub
@@ -34,6 +34,8 @@ a=4 b=7 ss=4 declare -i ss
a=4 b=7 foo
echo after: $a
+exec 7>&- 4>&-
+
unset a
a=4 echo foo 2>&1 >&$(foo) | { grep -q 'Bad file' || echo 'redir11 bad 3'; }
a=1 echo foo 2>&1 >&$(foo) | { grep -q 'Bad file' || echo 'redir11 bad 4'; }
diff --git a/tests/type.right b/tests/type.right
index bbc228e8..e0a66745 100644
--- a/tests/type.right
+++ b/tests/type.right
@@ -24,15 +24,15 @@ func ()
}
while
while is a shell keyword
-./type.tests: line 56: type: m: not found
-alias m='more'
-alias m='more'
-m is aliased to `more'
+./type.tests: line 59: type: morealias: not found
+alias morealias='more'
+alias morealias='more'
+morealias is aliased to `more'
alias
-alias m='more'
-alias m='more'
-alias m='more'
-m is aliased to `more'
+alias morealias='more'
+alias morealias='more'
+alias morealias='more'
+morealias is aliased to `more'
builtin
builtin is a shell builtin
/bin/sh
diff --git a/tests/type.tests b/tests/type.tests
index fd39c18a..ddc15407 100644
--- a/tests/type.tests
+++ b/tests/type.tests
@@ -25,8 +25,6 @@ type -r ${THIS_SH}
type notthere
command -v notthere
-alias m=more
-
unset -f func 2>/dev/null
func() { echo this is func; }
@@ -49,24 +47,26 @@ command -V func
command -v while
command -V while
+alias morealias=more
+
# the following two lines should produce the same output
# post-3.0 patch makes command -v silent, as posix specifies
# first test with alias expansion off (should all fail or produce no output)
-type -t m
-type m
-command -v m
+type -t morealias
+type morealias
+command -v morealias
alias -p
-alias m
+alias morealias
# then test with alias expansion on
shopt -s expand_aliases
-type m
-type -t m
-command -v m
+type morealias
+type -t morealias
+command -v morealias
alias -p
-alias m
+alias morealias
-command -V m
+command -V morealias
shopt -u expand_aliases
command -v builtin
@@ -76,7 +76,7 @@ command -V /bin/sh
unset -f func
type func
-unalias m
+unalias morealias
type m
hash -r
--
2.35.5