Patrick Williams | da29531 | 2023-12-05 16:48:56 -0600 | [diff] [blame^] | 1 | From 721d5be99eb37d31e48bd66d61808a66a4c5ab84 Mon Sep 17 00:00:00 2001 |
| 2 | From: Chet Ramey <chet.ramey@case.edu> |
| 3 | Date: Mon, 30 Oct 2023 12:16:07 -0400 |
| 4 | Subject: [PATCH] changes to SIGINT handler while waiting for a child; skip |
| 5 | vertical whitespace after translating an integer |
| 6 | |
| 7 | Upstream-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 | |
| 12 | Signed-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 | |
| 22 | diff --git a/general.c b/general.c |
| 23 | index 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 |
| 38 | diff --git a/jobs.c b/jobs.c |
| 39 | index 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 */ |
| 108 | diff --git a/tests/redir.right b/tests/redir.right |
| 109 | index 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 |
| 125 | diff --git a/tests/redir11.sub b/tests/redir11.sub |
| 126 | index 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'; } |
| 138 | diff --git a/tests/type.right b/tests/type.right |
| 139 | index 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 59: 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 |
| 166 | diff --git a/tests/type.tests b/tests/type.tests |
| 167 | index 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 | -- |
| 225 | 2.35.5 |
| 226 | |