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
This commit is contained in:
Kyle Evans 2019-12-26 22:49:19 +00:00
parent e211e5fec6
commit 6795e26b8a

View File

@ -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