summaryrefslogtreecommitdiffstats
path: root/meta/recipes-extended/bash/bash/0001-changes-to-SIGINT-handler-while-waiting-for-a-child-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-extended/bash/bash/0001-changes-to-SIGINT-handler-while-waiting-for-a-child-.patch')
-rw-r--r--meta/recipes-extended/bash/bash/0001-changes-to-SIGINT-handler-while-waiting-for-a-child-.patch226
1 files changed, 226 insertions, 0 deletions
diff --git a/meta/recipes-extended/bash/bash/0001-changes-to-SIGINT-handler-while-waiting-for-a-child-.patch b/meta/recipes-extended/bash/bash/0001-changes-to-SIGINT-handler-while-waiting-for-a-child-.patch
new file mode 100644
index 0000000000..77d770b364
--- /dev/null
+++ b/meta/recipes-extended/bash/bash/0001-changes-to-SIGINT-handler-while-waiting-for-a-child-.patch
@@ -0,0 +1,226 @@
1From 721d5be99eb37d31e48bd66d61808a66a4c5ab84 Mon Sep 17 00:00:00 2001
2From: Chet Ramey <chet.ramey@case.edu>
3Date: Mon, 30 Oct 2023 12:16:07 -0400
4Subject: [PATCH] changes to SIGINT handler while waiting for a child; skip
5 vertical whitespace after translating an integer
6
7Upstream-Status: Backport from
8[https://git.savannah.gnu.org/cgit/bash.git/commit/?h=devel&id=fe24a6a55e8850298b496c5b9d82f1866eba190e]
9
10[Adjust and drop some codes to be applicable the tree]
11
12Signed-off-by: Xiangyu Chen <xiangyu.chen@windriver.com>
13---
14 general.c | 5 +++--
15 jobs.c | 24 ++++++++++++++++--------
16 tests/redir.right | 4 ++--
17 tests/redir11.sub | 2 ++
18 tests/type.right | 16 ++++++++--------
19 tests/type.tests | 24 ++++++++++++------------
20 6 files changed, 43 insertions(+), 32 deletions(-)
21
22diff --git a/general.c b/general.c
23index 85c5a8b6..65e2ee06 100644
24--- a/general.c
25+++ b/general.c
26@@ -262,8 +262,9 @@ legal_number (string, result)
27 if (errno || ep == string)
28 return 0; /* errno is set on overflow or underflow */
29
30- /* Skip any trailing whitespace, since strtoimax does not. */
31- while (whitespace (*ep))
32+ /* Skip any trailing whitespace, since strtoimax does not, using the same
33+ test that strtoimax uses for leading whitespace. */
34+ while (isspace ((unsigned char) *ep))
35 ep++;
36
37 /* If *string is not '\0' but *ep is '\0' on return, the entire string
38diff --git a/jobs.c b/jobs.c
39index 6b986ed7..262d78de 100644
40--- a/jobs.c
41+++ b/jobs.c
42@@ -2718,6 +2718,10 @@ wait_for_background_pids (ps)
43 #define INVALID_SIGNAL_HANDLER (SigHandler *)wait_for_background_pids
44 static SigHandler *old_sigint_handler = INVALID_SIGNAL_HANDLER;
45
46+/* The current SIGINT handler as set by restore_sigint_handler. Only valid
47+ immediately after restore_sigint_handler, used for continuations. */
48+static SigHandler *cur_sigint_handler = INVALID_SIGNAL_HANDLER;
49+
50 static int wait_sigint_received;
51 static int child_caught_sigint;
52
53@@ -2735,6 +2739,7 @@ wait_sigint_cleanup ()
54 static void
55 restore_sigint_handler ()
56 {
57+ cur_sigint_handler = old_sigint_handler;
58 if (old_sigint_handler != INVALID_SIGNAL_HANDLER)
59 {
60 set_signal_handler (SIGINT, old_sigint_handler);
61@@ -2758,8 +2763,7 @@ wait_sigint_handler (sig)
62 restore_sigint_handler ();
63 /* If we got a SIGINT while in `wait', and SIGINT is trapped, do
64 what POSIX.2 says (see builtins/wait.def for more info). */
65- if (this_shell_builtin && this_shell_builtin == wait_builtin &&
66- signal_is_trapped (SIGINT) &&
67+ if (signal_is_trapped (SIGINT) &&
68 ((sigint_handler = trap_to_sighandler (SIGINT)) == trap_handler))
69 {
70 trap_handler (SIGINT); /* set pending_traps[SIGINT] */
71@@ -2782,6 +2786,8 @@ wait_sigint_handler (sig)
72 {
73 set_exit_status (128+SIGINT);
74 restore_sigint_handler ();
75+ if (cur_sigint_handler == INVALID_SIGNAL_HANDLER)
76+ set_sigint_handler (); /* XXX - only do this in one place */
77 kill (getpid (), SIGINT);
78 }
79
80@@ -2926,11 +2932,13 @@ wait_for (pid, flags)
81 {
82 SigHandler *temp_sigint_handler;
83
84- temp_sigint_handler = set_signal_handler (SIGINT, wait_sigint_handler);
85- if (temp_sigint_handler == wait_sigint_handler)
86- internal_debug ("wait_for: recursively setting old_sigint_handler to wait_sigint_handler: running_trap = %d", running_trap);
87- else
88- old_sigint_handler = temp_sigint_handler;
89+ temp_sigint_handler = old_sigint_handler;
90+ old_sigint_handler = set_signal_handler (SIGINT, wait_sigint_handler);
91+ if (old_sigint_handler == wait_sigint_handler)
92+ {
93+ internal_debug ("wait_for: recursively setting old_sigint_handler to wait_sigint_handler: running_trap = %d", running_trap);
94+ old_sigint_handler = temp_sigint_handler;
95+ }
96 waiting_for_child = 0;
97 if (old_sigint_handler == SIG_IGN)
98 set_signal_handler (SIGINT, old_sigint_handler);
99@@ -4136,7 +4144,7 @@ set_job_status_and_cleanup (job)
100 SIGINT (if we reset the sighandler to the default).
101 In this case, we have to fix things up. What a crock. */
102 if (temp_handler == trap_handler && signal_is_trapped (SIGINT) == 0)
103- temp_handler = trap_to_sighandler (SIGINT);
104+ temp_handler = trap_to_sighandler (SIGINT);
105 restore_sigint_handler ();
106 if (temp_handler == SIG_DFL)
107 termsig_handler (SIGINT); /* XXX */
108diff --git a/tests/redir.right b/tests/redir.right
109index 8db10414..9e1403c8 100644
110--- a/tests/redir.right
111+++ b/tests/redir.right
112@@ -154,10 +154,10 @@ foo
113 1
114 7
115 after: 42
116-./redir11.sub: line 53: $(ss= declare -i ss): ambiguous redirect
117+./redir11.sub: line 55: $(ss= declare -i ss): ambiguous redirect
118 after: 42
119 a+=3
120 foo
121 foo
122-./redir11.sub: line 75: 42: No such file or directory
123+./redir11.sub: line 77: 42: No such file or directory
124 42
125diff --git a/tests/redir11.sub b/tests/redir11.sub
126index d417cdb6..ca9854cd 100644
127--- a/tests/redir11.sub
128+++ b/tests/redir11.sub
129@@ -34,6 +34,8 @@ a=4 b=7 ss=4 declare -i ss
130 a=4 b=7 foo
131 echo after: $a
132
133+exec 7>&- 4>&-
134+
135 unset a
136 a=4 echo foo 2>&1 >&$(foo) | { grep -q 'Bad file' || echo 'redir11 bad 3'; }
137 a=1 echo foo 2>&1 >&$(foo) | { grep -q 'Bad file' || echo 'redir11 bad 4'; }
138diff --git a/tests/type.right b/tests/type.right
139index bbc228e8..e0a66745 100644
140--- a/tests/type.right
141+++ b/tests/type.right
142@@ -24,15 +24,15 @@ func ()
143 }
144 while
145 while is a shell keyword
146-./type.tests: line 56: type: m: not found
147-alias m='more'
148-alias m='more'
149-m is aliased to `more'
150+./type.tests: line 56: type: morealias: not found
151+alias morealias='more'
152+alias morealias='more'
153+morealias is aliased to `more'
154 alias
155-alias m='more'
156-alias m='more'
157-alias m='more'
158-m is aliased to `more'
159+alias morealias='more'
160+alias morealias='more'
161+alias morealias='more'
162+morealias is aliased to `more'
163 builtin
164 builtin is a shell builtin
165 /bin/sh
166diff --git a/tests/type.tests b/tests/type.tests
167index fd39c18a..ddc15407 100644
168--- a/tests/type.tests
169+++ b/tests/type.tests
170@@ -25,8 +25,6 @@ type -r ${THIS_SH}
171 type notthere
172 command -v notthere
173
174-alias m=more
175-
176 unset -f func 2>/dev/null
177 func() { echo this is func; }
178
179@@ -49,24 +47,26 @@ command -V func
180 command -v while
181 command -V while
182
183+alias morealias=more
184+
185 # the following two lines should produce the same output
186 # post-3.0 patch makes command -v silent, as posix specifies
187 # first test with alias expansion off (should all fail or produce no output)
188-type -t m
189-type m
190-command -v m
191+type -t morealias
192+type morealias
193+command -v morealias
194 alias -p
195-alias m
196+alias morealias
197
198 # then test with alias expansion on
199 shopt -s expand_aliases
200-type m
201-type -t m
202-command -v m
203+type morealias
204+type -t morealias
205+command -v morealias
206 alias -p
207-alias m
208+alias morealias
209
210-command -V m
211+command -V morealias
212 shopt -u expand_aliases
213
214 command -v builtin
215@@ -76,7 +76,7 @@ command -V /bin/sh
216
217 unset -f func
218 type func
219-unalias m
220+unalias morealias
221 type m
222
223 hash -r
224--
2252.35.5
226