mirror of
https://https.git.savannah.gnu.org/git/bash.git
synced 2026-07-03 02:10:50 +02:00
changes to SIGINT handler while waiting for a child; skip vertical whitespace after translating an integer
This commit is contained in:
@@ -7910,3 +7910,21 @@ builtins/printf.def
|
||||
- printf_builtin: handle field width and precision overflow from
|
||||
getint() by ignoring the argument (fieldwidth = 0, precision = -1)
|
||||
|
||||
10/26
|
||||
-----
|
||||
jobs.c
|
||||
- wait_for: rearrange code that sets the SIGINT handler to
|
||||
wait_sigint_handler and saves the old handler to old_sigint_handler
|
||||
to avoid delay before assigning the handler
|
||||
Report from Wenlin Kang <wenlin.kang@windriver.com>
|
||||
- wait_sigint_handler: if cur_sigint_handler (what restore_sigint_handler)
|
||||
just restored or ignored) is INVALID_SIGNAL_HANDLER, set the
|
||||
appropriate SIGINT handler with set_sigint_handler before sending
|
||||
ourselves SIGINT
|
||||
|
||||
10/30
|
||||
-----
|
||||
general.c
|
||||
- legal_number: use the same test (isspace(3)) to skip trailing
|
||||
whitespace that strtoimax uses to skip leading whitespace.
|
||||
Report and patch from Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
+1
-1
@@ -5422,7 +5422,7 @@ execute_subshell_builtin_or_function (WORD_LIST *words, REDIRECT *redirects,
|
||||
handler = set_sigint_handler ();
|
||||
if (handler == SIG_IGN && signal_is_async_ignored (SIGINT) &&
|
||||
signal_is_trapped (SIGINT) == 0 && signal_is_hard_ignored (SIGINT) == 0)
|
||||
set_signal_handler (SIGINT, handler);
|
||||
set_signal_handler (SIGINT, SIG_IGN);
|
||||
}
|
||||
|
||||
if (fds_to_close)
|
||||
|
||||
@@ -214,7 +214,7 @@ extern void print_clock_t (FILE *, clock_t);
|
||||
|
||||
/* Declarations for functions defined in lib/sh/dprintf.c */
|
||||
#if !defined (HAVE_DPRINTF)
|
||||
extern void dprintf (int, const char *, ...)) __attribute__((__format__ (printf, 2, 3));
|
||||
extern void dprintf (int, const char *, ...) __attribute__((__format__ (printf, 2, 3));
|
||||
#endif
|
||||
|
||||
/* Declarations for functions defined in lib/sh/fmtulong.c */
|
||||
|
||||
@@ -257,8 +257,9 @@ legal_number (const char *string, intmax_t *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
|
||||
|
||||
@@ -2664,6 +2664,10 @@ wait_for_background_pids (struct procstat *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;
|
||||
|
||||
@@ -2681,6 +2685,7 @@ wait_sigint_cleanup (void)
|
||||
static void
|
||||
restore_sigint_handler (void)
|
||||
{
|
||||
cur_sigint_handler = old_sigint_handler;
|
||||
if (old_sigint_handler != INVALID_SIGNAL_HANDLER)
|
||||
{
|
||||
set_signal_handler (SIGINT, old_sigint_handler);
|
||||
@@ -2703,8 +2708,7 @@ wait_sigint_handler (int 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] */
|
||||
@@ -2727,6 +2731,8 @@ wait_sigint_handler (int 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);
|
||||
}
|
||||
|
||||
@@ -2876,11 +2882,13 @@ wait_for (pid_t pid, int 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);
|
||||
@@ -4105,7 +4113,7 @@ set_job_status_and_cleanup (int 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 */
|
||||
|
||||
+2
-2
@@ -160,12 +160,12 @@ 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
|
||||
./redir12.sub: line 27: unwritable-file: Permission denied
|
||||
1 x =
|
||||
|
||||
@@ -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'; }
|
||||
|
||||
+8
-8
@@ -25,15 +25,15 @@ func ()
|
||||
}
|
||||
while
|
||||
while is a shell keyword
|
||||
./type.tests: line 59: 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
|
||||
|
||||
+12
-12
@@ -28,8 +28,6 @@ command -v notthere
|
||||
# but this will produce an error message
|
||||
command -V notthere
|
||||
|
||||
alias m=more
|
||||
|
||||
unset -f func 2>/dev/null
|
||||
func() { echo this is func; }
|
||||
|
||||
@@ -52,24 +50,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
|
||||
@@ -79,7 +79,7 @@ command -V /bin/sh
|
||||
|
||||
unset -f func
|
||||
type func
|
||||
unalias m
|
||||
unalias morealias
|
||||
type m
|
||||
|
||||
hash -r
|
||||
|
||||
Reference in New Issue
Block a user