fix crash with unset arrays in arithmetic constructs ; change to avoid printing foreground job statuses when we don't want to

This commit is contained in:
Chet Ramey
2022-10-04 11:58:54 -04:00
parent e6dc31ac13
commit 43e861c2cd
10 changed files with 76 additions and 12 deletions
+30
View File
@@ -3990,3 +3990,33 @@ lib/sh/{mbscasecmp,mbscmp}.c
- 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>
+1 -1
View File
@@ -1,4 +1,4 @@
'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.
Vendored
+5 -2
View File
@@ -20432,7 +20432,6 @@ printf "%s\n" "#define HAVE_DECL_STRTOIMAX $ac_have_decl" >>confdefs.h
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
@@ -20443,7 +20442,11 @@ fi
{ 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"
+5 -2
View File
@@ -648,6 +648,7 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
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;
@@ -690,6 +691,10 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
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
@@ -700,8 +705,6 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
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;
+24 -3
View File
@@ -270,6 +270,8 @@ static int set_job_status_and_cleanup PARAMS((int));
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));
@@ -1226,8 +1228,12 @@ cleanup_dead_jobs ()
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)
@@ -2876,6 +2882,20 @@ job_exit_signal (job)
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 \
{ \
@@ -3283,7 +3303,7 @@ wait_for_any_job (flags, ps)
{
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);
@@ -4318,6 +4338,7 @@ notify_of_job_status ()
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))
+1 -1
View File
@@ -818,7 +818,7 @@ rl_getc (FILE *stream)
/* 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;
+4 -2
View File
@@ -21,7 +21,6 @@ AC_CACHE_VAL(bash_cv_func_strtoimax,
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
@@ -29,7 +28,10 @@ AC_CACHE_VAL(bash_cv_func_strtoimax,
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
])
+1 -1
View File
@@ -10862,7 +10862,7 @@ expand_array_subscript (string, sindex, quoted, flags)
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);
+2
View File
@@ -757,6 +757,8 @@ declare -A A=([$'\t']="X" ["*"]="X" [" "]="X" ["@"]="X" )
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]="")
+3
View File
@@ -76,3 +76,6 @@ for k in ']' '*' '@'; do
declare "A[$k]=X"
done
declare -p A
# empty arrays in arith contexts
(( y[$none] ))