diff options
author | Kyle Evans <kevans@FreeBSD.org> | 2019-12-26 22:49:19 +0000 |
---|---|---|
committer | Kyle Evans <kevans@FreeBSD.org> | 2019-12-26 22:49:19 +0000 |
commit | 6795e26b8a77d9c954dfe811e4f5d7a2e529d987 (patch) | |
tree | 87ff949dbcdc242decb65298e6ad8ff0a8d1258a /usr.sbin/cron | |
parent | e211e5fec6622350914807ab9c92db34e0756a56 (diff) | |
download | src-6795e26b8a77d9c954dfe811e4f5d7a2e529d987.tar.gz src-6795e26b8a77d9c954dfe811e4f5d7a2e529d987.zip |
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
Notes
Notes:
svn path=/head/; revision=356103
Diffstat (limited to 'usr.sbin/cron')
-rw-r--r-- | usr.sbin/cron/cron/do_command.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/usr.sbin/cron/cron/do_command.c b/usr.sbin/cron/cron/do_command.c index 3810e5290285..4a9a49e6c8ae 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 |