From: Chet Ramey Date: Fri, 9 Feb 2024 15:56:43 +0000 (-0500) Subject: fix for background jobs killed by SIGTERM being marked as notified X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fbc7d97de6c6f3dedb34f49f89a628a99ef6ddf5;p=thirdparty%2Fbash.git fix for background jobs killed by SIGTERM being marked as notified --- diff --git a/CWRU/CWRU.chlog b/CWRU/CWRU.chlog index 41ab1e448..9498c7629 100644 --- a/CWRU/CWRU.chlog +++ b/CWRU/CWRU.chlog @@ -1,4 +1,4 @@ - +\ 12/6/2020 --------- @@ -8561,3 +8561,13 @@ bashline.c doc/bash.1,lib/readline/doc/readline.3 - minor updates to handle old versions of troff and groff warnings Fixes from G. Branden Robinson + + 2/7 + --- +jobs.c + - notify_of_job_status: in non-interactive shells, if we're not going + to print information about a terminated background job + (SIGINT/SIGTERM/SIGPIPE), don't mark it as notified, in the same + way that we don't mark background jobs that exit cleanly as notified + Inspired by a discussion with Robert Elz and + https://lists.gnu.org/archive/html/bug-bash/2024-01/msg00189.html diff --git a/config-top.h b/config-top.h index 62b67096f..eaf9337b7 100644 --- a/config-top.h +++ b/config-top.h @@ -45,7 +45,7 @@ when a job like `cat jobs.c | exit 1' terminates due to a SIGPIPE. */ #define DONT_REPORT_SIGPIPE -/* Define DONT_REPORT_SIGTERM if you don't want to see `Terminates' message +/* Define DONT_REPORT_SIGTERM if you don't want to see `Terminated' message when a job exits due to SIGTERM, since that's the default signal sent by the kill builtin. */ #define DONT_REPORT_SIGTERM diff --git a/jobs.c b/jobs.c index c0569c2e1..caafa734a 100644 --- a/jobs.c +++ b/jobs.c @@ -4282,6 +4282,19 @@ notify_of_job_status (void) ((DEADJOB (job) && IS_FOREGROUND (job) == 0) || STOPPED (job))) continue; + /* Do the same thing and don't print anything or mark as notified + for the signals we're not going to report on */ + else if (startup_state == 0 && DEADJOB (job) && IS_FOREGROUND (job) == 0 && + WIFSIGNALED (s) && (termsig == SIGINT +#if defined (DONT_REPORT_SIGTERM) + || termsig == SIGTERM +#endif +#if defined (DONT_REPORT_SIGPIPE) + || termsig == SIGPIPE +#endif + )) + continue; + /* If job control is disabled, don't print the status messages. Mark dead jobs as notified so that they get cleaned up. If startup_state == 2 and subshell_environment has the @@ -4304,7 +4317,7 @@ notify_of_job_status (void) /* Print info on jobs that are running in the background, and on foreground jobs that were killed by anything - except SIGINT (and possibly SIGPIPE). */ + except SIGINT (and possibly SIGTERM and SIGPIPE). */ switch (JOBSTATE (job)) { case JDEAD: @@ -4324,6 +4337,7 @@ notify_of_job_status (void) } else if (IS_FOREGROUND (job)) { + /* foreground jobs, interactive and non-interactive shells */ #if !defined (DONT_REPORT_SIGPIPE) if (termsig && WIFSIGNALED (s) && termsig != SIGINT) #else @@ -4337,10 +4351,13 @@ notify_of_job_status (void) fprintf (stderr, "\n"); } + /* foreground jobs that exit cleanly */ jobs[job]->flags |= J_NOTIFIED; } else if (job_control) { + /* background jobs with job control, interactive and + non-interactive shells */ if (dir == 0) dir = current_working_directory (); pretty_print_job (job, JLIST_STANDARD, stderr); @@ -4349,16 +4366,9 @@ notify_of_job_status (void) _("(wd now: %s)\n"), polite_directory_format (dir)); } - /* This is where we set J_NOTIFIED for background jobs in - non-interactive shells without job control enabled that are - killed by SIGINT or SIGTERM (DONT_REPORT_SIGTERM) or SIGPIPE - (DONT_REPORT_SIGPIPE) as long as those signals are not - trapped, or that exit cleanly. - Interactive shells without job control enabled are handled + /* Interactive shells without job control enabled are handled above. */ - /* XXX - if we want to arrange to keep these jobs in the jobs - list, instead of making them eligible to move to bgpids, - this is where to change things. */ + /* XXX - this is a catch-all in case we missed a state */ jobs[job]->flags |= J_NOTIFIED; break; diff --git a/tests/printf6.sub b/tests/printf6.sub index fbacd4d53..8a0af3007 100644 --- a/tests/printf6.sub +++ b/tests/printf6.sub @@ -11,6 +11,8 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . # +LC_ALL=en_US.UTF-8 + # this should echo nothing printf '%ls' # this should echo a null byte