git: 4ac6582472a2 - main - syslogd: Ignore signals in sigcatch[]

From: Mark Johnston <markj_at_FreeBSD.org>
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);