The branch main has been updated by markj:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=4ac6582472a2f4be06217cfbfd7a9d049f2cd6d6

commit 4ac6582472a2f4be06217cfbfd7a9d049f2cd6d6
Author:     Jake Freeland <jf...@freebsd.org>
AuthorDate: 2023-09-01 02:51:22 +0000
Commit:     Mark Johnston <ma...@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);

Reply via email to