From 6795e26b8a77d9c954dfe811e4f5d7a2e529d987 Mon Sep 17 00:00:00 2001 From: Kyle Evans Date: Thu, 26 Dec 2019 22:49:19 +0000 Subject: [PATCH] cron(8): use proper variable to determine mailer process status While the mailer is normally opened/set if the mailto is set, this is not the case if the grandchild actually didn't produce any output. This change corrects the situation to only attempt to kill/close the mail process if it was actually opened in the first place. The reporter initially stumbled on the -n (suppress mail on success) flag leading to a SIGKILL of the process group, but simultaneously discovered/reported the behavior with !-n jobs if MAILTO was set and no output happened. All of these places that are checking mailto should actually be checking whether mail is set, so do that for consistency+correctness. This set of bugs were introduced by r352668. Submitted by: sigsys@gmail.com Reported by: sigsys@gmail.com --- usr.sbin/cron/cron/do_command.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/usr.sbin/cron/cron/do_command.c b/usr.sbin/cron/cron/do_command.c index 3810e529028..4a9a49e6c8a 100644 --- a/usr.sbin/cron/cron/do_command.c +++ b/usr.sbin/cron/cron/do_command.c @@ -460,6 +460,8 @@ child_process(e, u) _exit(ERROR_EXIT); } + mail = NULL; + ch = getc(in); if (ch != EOF) { Debug(DPROC|DEXT, @@ -531,7 +533,7 @@ child_process(e, u) while (EOF != (ch = getc(in))) { bytes++; - if (mailto) + if (mail) putc(ch, mail); } } @@ -555,12 +557,12 @@ child_process(e, u) */ if (WIFEXITED(waiter) && WEXITSTATUS(waiter) == 0 && (e->flags & MAIL_WHEN_ERR) == MAIL_WHEN_ERR - && mailto) { + && mail) { Debug(DPROC, ("[%d] %s executed successfully, mail suppressed\n", getpid(), "grandchild command job")) kill(mailpid, SIGKILL); (void)fclose(mail); - mailto = NULL; + mail = NULL; } @@ -568,7 +570,7 @@ child_process(e, u) * mailing... */ - if (mailto) { + if (mail) { Debug(DPROC, ("[%d] closing pipe to mail\n", getpid())) /* Note: the pclose will probably see