git: 4ac6582472a2 - main - syslogd: Ignore signals in sigcatch[]
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 28 Sep 2023 15:52:47 UTC
The branch main has been updated by markj:
URL: https://cgit.FreeBSD.org/src/commit/?id=4ac6582472a2f4be06217cfbfd7a9d049f2cd6d6
commit 4ac6582472a2f4be06217cfbfd7a9d049f2cd6d6
Author: Jake Freeland <jfree@FreeBSD.org>
AuthorDate: 2023-09-01 02:51:22 +0000
Commit: Mark Johnston <markj@FreeBSD.org>
CommitDate: 2023-09-28 15:51:54 +0000
syslogd: Ignore signals in sigcatch[]
Instead of blocking signals in sigcatch[], just ignore them. This frees
up some space on the proc's sigqueue.
Reviewed by: markj
MFC after: 3 weeks
Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D41433
---
usr.sbin/syslogd/syslogd.c | 42 ++++++++++++++++++++----------------------
1 file changed, 20 insertions(+), 22 deletions(-)
diff --git a/usr.sbin/syslogd/syslogd.c b/usr.sbin/syslogd/syslogd.c
index 2ff39d8c3676..3f9633ca8c35 100644
--- a/usr.sbin/syslogd/syslogd.c
+++ b/usr.sbin/syslogd/syslogd.c
@@ -597,7 +597,6 @@ int
main(int argc, char *argv[])
{
struct sigaction act = { };
- sigset_t sigset = { };
struct kevent ev;
struct socklist *sl;
pid_t ppid = -1, spid;
@@ -838,6 +837,14 @@ main(int argc, char *argv[])
exit(1);
}
}
+
+ /*
+ * Syslogd will not reap its children via wait().
+ * When SIGCHLD is ignored, zombie processes are
+ * not created. A child's PID will be recycled
+ * upon its exit.
+ */
+ act.sa_handler = SIG_IGN;
for (size_t i = 0; i < nitems(sigcatch); ++i) {
EV_SET(&ev, sigcatch[i], EVFILT_SIGNAL, EV_ADD, 0, 0, NULL);
if (kevent(kq, &ev, 1, NULL, 0, NULL) == -1) {
@@ -845,23 +852,14 @@ main(int argc, char *argv[])
pidfile_remove(pfh);
exit(1);
}
- (void)sigaddset(&sigset, sigcatch[i]);
- }
- if (sigprocmask(SIG_BLOCK, &sigset, NULL) != 0) {
- warn("failed to apply signal mask");
- pidfile_remove(pfh);
- exit(1);
+ if (sigaction(sigcatch[i], &act, NULL) == -1) {
+ warn("failed to apply signal handler");
+ pidfile_remove(pfh);
+ exit(1);
+ }
}
(void)alarm(TIMERINTVL);
- /* Do not create zombie processes. */
- act.sa_flags = SA_NOCLDWAIT;
- if (sigaction(SIGCHLD, &act, NULL) == -1) {
- warn("failed to apply signal handler");
- pidfile_remove(pfh);
- exit(1);
- }
-
/* tuck my process id away */
pidfile_write(pfh);
@@ -3598,7 +3596,7 @@ validate(struct sockaddr *sa, const char *hname)
static int
p_open(const char *prog, int *rpd)
{
- sigset_t sigset = { };
+ struct sigaction act = { };
int pfd[2], pd;
pid_t pid;
char *argv[4]; /* sh -c cmd NULL */
@@ -3623,12 +3621,12 @@ p_open(const char *prog, int *rpd)
}
alarm(0);
-
- for (size_t i = 0; i < nitems(sigcatch); ++i)
- (void)sigaddset(&sigset, sigcatch[i]);
- if (sigprocmask(SIG_UNBLOCK, &sigset, NULL) != 0) {
- logerror("sigprocmask");
- exit(1);
+ act.sa_handler = SIG_DFL;
+ for (size_t i = 0; i < nitems(sigcatch); ++i) {
+ if (sigaction(sigcatch[i], &act, NULL) == -1) {
+ logerror("sigaction");
+ exit(1);
+ }
}
dup2(pfd[0], STDIN_FILENO);