diff --git a/CWRU/CWRU.chlog b/CWRU/CWRU.chlog index 96723955..c5286520 100644 --- a/CWRU/CWRU.chlog +++ b/CWRU/CWRU.chlog @@ -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 + + 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 , + patch from Koichi Murase + + 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 + - 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 + +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 diff --git a/builtins/wait.def b/builtins/wait.def index b066d78d..1a49430a 100644 --- a/builtins/wait.def +++ b/builtins/wait.def @@ -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. diff --git a/configure b/configure index 28e09134..0c3ef2cb 100755 --- a/configure +++ b/configure @@ -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" diff --git a/execute_cmd.c b/execute_cmd.c index e5c6b9ab..b62f9105 100644 --- a/execute_cmd.c +++ b/execute_cmd.c @@ -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; diff --git a/jobs.c b/jobs.c index 6b986ed7..f7112627 100644 --- a/jobs.c +++ b/jobs.c @@ -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)) diff --git a/lib/readline/input.c b/lib/readline/input.c index 6f038d45..8c5d6fb6 100644 --- a/lib/readline/input.c +++ b/lib/readline/input.c @@ -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; diff --git a/m4/strtoimax.m4 b/m4/strtoimax.m4 index 30985723..4d6cb3ba 100644 --- a/m4/strtoimax.m4 +++ b/m4/strtoimax.m4 @@ -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 ]) diff --git a/subst.c b/subst.c index 89e40688..bae6e3a1 100644 --- a/subst.c +++ b/subst.c @@ -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); diff --git a/tests/array.right b/tests/array.right index 62278852..36d49363 100644 --- a/tests/array.right +++ b/tests/array.right @@ -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]="") diff --git a/tests/array27.sub b/tests/array27.sub index e2a1e708..85645641 100644 --- a/tests/array27.sub +++ b/tests/array27.sub @@ -76,3 +76,6 @@ for k in ']' '*' '@'; do declare "A[$k]=X" done declare -p A + +# empty arrays in arith contexts +(( y[$none] ))