- 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>
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)
/* 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 */
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
#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;
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);
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] */
{
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);
}
{
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);
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 */
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 =
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'; }
}
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
# but this will produce an error message
command -V notthere
-alias m=more
-
unset -f func 2>/dev/null
func() { echo this is 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
unset -f func
type func
-unalias m
+unalias morealias
type m
hash -r