- mbscasecmp,mbscmp: use different mbstate_t objects for the different
strings so they don't affect each others' intermediate mbstate.
From Koichi Murase <myoga.murase@gmail.com>
+
+ 9/28
+ ----
+execute_cmd.c
+ - execute_command_internal: if executing a (command) subshell, restore
+ the value of line_number from save_line_number before returning early
+ due to being a non-terminal pipeline element.
+ From https://savannah.gnu.org/support/index.php?110714
+
+ 9/30
+ ----
+subst.c
+ - expand_array_subscript: make sure to pass a non-NULL first argument
+ to sh_backslash_quote. Report from Emanuele Torre <torreemanuele6@gmail.com>,
+ patch from Koichi Murase <myoga.murase@gmail.com>
+
+ 9/30
+ ----
+jobs.c
+ - cleanup_dead_jobs: delete dead foreground jobs we won't notify the
+ user about (those not killed by a signal or killed by SIGINT/SIGPIPE).
+ From a report from Koichi Murase <myoga.murase@gmail.com>
+ - wait_for_any_job: never return a foreground job, even when requested
+ by pid, if it's in the jobs list
+ Report and fix from Koichi Murase <myoga.murase@gmail.com>
+
+m4/strtoimax.m4
+ - BASH_FUNC_STRTOIMAX: fix logic inversion of result; we should be
+ replacing the function if the tests show we *don't* have a working
+ version. Report from Emanuel Haupt <ehaupt@FreeBSD.org>
-'This file is wait.def, from which is created wait.c.
+This file is wait.def, from which is created wait.c.
It implements the builtin "wait" in Bash.
Copyright (C) 1987-2021 Free Software Foundation, Inc.
if test "$ac_cv_have_decl_strtoimax" = "yes" ; then
HAVE_DECL_STRTOIMAX=1
fi
-
if test "$HAVE_STRTOIMAX" = 0 || test "$HAVE_DECL_STRTOIMAX" = 0 ; then
bash_cv_func_strtoimax=no REPLACE_STRTOIMAX=1
else
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_func_strtoimax" >&5
printf "%s\n" "$bash_cv_func_strtoimax" >&6; }
-if test $bash_cv_func_strtoimax = yes; then
+if test "$ac_cv_have_decl_strtoimax" = "yes" ; then
+printf "%s\n" "#define HAVE_DECL_STRTOIMAX 1" >>confdefs.h
+
+fi
+if test $bash_cv_func_strtoimax = no; then
case " $LIBOBJS " in
*" strtoimax.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS strtoimax.$ac_objext"
save_line_number = line_number;
if (command->type == cm_subshell)
SET_LINE_NUMBER (command->value.Subshell->line); /* XXX - save value? */
+
/* Otherwise we defer setting line_number */
tcmd = make_command_string (command);
fork_flags = asynchronous ? FORK_ASYNC : 0;
if (variable_context == 0) /* wait until shell function completes */
unlink_fifo_list ();
#endif
+
+ /* Restore any saved state here before possible early return. */
+ line_number = save_line_number;
+
/* If we are part of a pipeline, and not the end of the pipeline,
then we should simply return and let the last command in the
pipe be waited for. If we are not in a pipeline, or are the
stop_pipeline (asynchronous, (COMMAND *)NULL);
- line_number = save_line_number;
-
if (asynchronous == 0)
{
was_error_trap = signal_is_trapped (ERROR_TRAP) && signal_is_ignored (ERROR_TRAP) == 0;
static WAIT job_signal_status PARAMS((int));
static WAIT raw_job_exit_status PARAMS((int));
+static int job_killed_by_signal PARAMS((int));
+
static void notify_of_job_status PARAMS((void));
static void reset_job_indices PARAMS((void));
static void cleanup_dead_jobs PARAMS((void));
if (i > js.j_lastj && jobs[i])
INTERNAL_DEBUG(("cleanup_dead_jobs: job %d non-null after js.j_lastj (%d)", i, js.j_lastj));
- if (jobs[i] && DEADJOB (i) && IS_NOTIFIED (i))
- delete_job (i, 0);
+ if (jobs[i] == 0 || DEADJOB (i) == 0)
+ continue; /* not a candidate */
+ else if (IS_NOTIFIED (i))
+ delete_job (i, 0); /* already notified */
+ else if (IS_FOREGROUND (i) && job_killed_by_signal (i) == 0)
+ delete_job (i, 0); /* we won't notify about this */
}
#if defined (PROCESS_SUBSTITUTION)
return (process_exit_signal (raw_job_exit_status (job)));
}
+static int
+job_killed_by_signal (job)
+ int job;
+{
+ int termsig;
+
+ termsig = job_exit_signal (job);
+#if !defined (DONT_REPORT_SIGPIPE)
+ return (termsig && termsig != SIGINT);
+#else
+ return (termsig && termsig != SIGINT && termsig != SIGPIPE);
+#endif
+}
+
#define FIND_CHILD(pid, child) \
do \
{ \
{
if ((flags & JWAIT_WAITING) && jobs[i] && IS_WAITING (i) == 0)
continue; /* if we don't want it, skip it */
- if (jobs[i] && DEADJOB (i) && IS_NOTIFIED (i) == 0)
+ if (jobs[i] && DEADJOB (i) && IS_NOTIFIED (i) == 0 && IS_FOREGROUND (i) == 0)
{
return_job:
r = job_exit_status (i);
if (termsig && WIFSIGNALED (s) && termsig != SIGINT && termsig != SIGPIPE)
#endif
{
+itrace("notify_of_job_status: printing status of foreground job %d", job);
fprintf (stderr, "%s", j_strsignal (termsig));
if (WIFCORED (s))
/* We know at this point that _rl_caught_signal == 0 */
#if defined (__MINGW32__)
- if (isatty (fd)
+ if (isatty (fd))
return (_getch ()); /* "There is no error return." */
#endif
result = 0;
if test "$ac_cv_have_decl_strtoimax" = "yes" ; then
HAVE_DECL_STRTOIMAX=1
fi
-
if test "$HAVE_STRTOIMAX" = 0 || test "$HAVE_DECL_STRTOIMAX" = 0 ; then
bash_cv_func_strtoimax=no REPLACE_STRTOIMAX=1
else
fi
])
AC_MSG_RESULT($bash_cv_func_strtoimax)
-if test $bash_cv_func_strtoimax = yes; then
+if test "$ac_cv_have_decl_strtoimax" = "yes" ; then
+AC_DEFINE([HAVE_DECL_STRTOIMAX], [1])
+fi
+if test $bash_cv_func_strtoimax = no; then
AC_LIBOBJ(strtoimax)
fi
])
exp = substring (string, si+1, ni);
t = expand_subscript_string (exp, quoted & ~(Q_ARITH|Q_DOUBLE_QUOTES));
free (exp);
- exp = sh_backslash_quote (t, abstab, 0);
+ exp = t ? sh_backslash_quote (t, abstab, 0) : savestring ("");
free (t);
slen = STRLEN (exp);
declare -A A=(["*"]="X" ["@"]="X" )
./array27.sub: line 76: declare: `A[]]=X': not a valid identifier
declare -A A=(["*"]="X" ["@"]="X" )
+./array27.sub: line 81: y[]: bad array subscript
+./array27.sub: line 81: y[]: bad array subscript
declare -a bug4=([0]="" [1]="5" [2]="" [3]="1" [4]="")
declare -a bug=([0]="" [1]="5" [2]="" [3]="1" [4]="")
declare -a bug2=([0]="")
declare "A[$k]=X"
done
declare -p A
+
+# empty arrays in arith contexts
+(( y[$none] ))