--- syslogd.c | 68 ++++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 42 insertions(+), 26 deletions(-) --- syslogd.c +++ syslogd.c 2022-10-19 09:49:43.134694341 +0000 @@ -544,6 +544,10 @@ static char sccsid[] __attribute__ ((un #include #include #include +#ifndef _GNU_SOURCE +typedef void (*sighandler_t)(int); +#endif +static sighandler_t resignal(int signum, sighandler_t handler); #include #include @@ -618,7 +622,7 @@ char **parts; int inetm = 0; static int debugging_on = 0; static int nlogs = -1; -static int restart = 0; +static volatile sig_atomic_t restart; #define MAXFUNIX 20 @@ -1134,13 +1138,13 @@ int main(argc, argv) leave = 0; - (void) signal(SIGTERM, die); + (void) resignal(SIGTERM, die); /* Make recvfrom() be able to receive EINTR */ (void) signal(SIGINT, Debug ? die : SIG_IGN); (void) signal(SIGQUIT, Debug ? die : SIG_IGN); - (void) signal(SIGCHLD, reapchild); - (void) signal(SIGALRM, domark); - (void) signal(SIGUSR1, Debug ? debug_switch : SIG_IGN); + (void) resignal(SIGCHLD, reapchild); + (void) resignal(SIGUSR1, Debug ? debug_switch : SIG_IGN); (void) signal(SIGXFSZ, SIG_IGN); + (void) resignal(SIGALRM, domark); /* Make recvfrom() be able to receive EINTR */ (void) alarm(TIMERINTVL); /* Create a partial message table for all file descriptors. */ @@ -1161,6 +1165,7 @@ int main(argc, argv) dprintf("Starting.\n"); init(); + (void) resignal(SIGHUP, sighup_handler); #ifndef TESTING if ( Debug ) { @@ -1232,9 +1237,14 @@ int main(argc, argv) (fd_set *) NULL, (struct timeval *) NULL); if ( restart ) { + sigset_t blockhup; + sigemptyset(&blockhup); + sigaddset (&blockhup, SIGHUP); + (void) sigprocmask(SIG_BLOCK, &blockhup, NULL); restart = 0; dprintf("\nReceived SIGHUP, reloading syslogd.\n"); init(); + (void) sigprocmask (SIG_UNBLOCK, &blockhup, NULL); continue; } if (nfds == 0) { @@ -1756,7 +1766,8 @@ void logmsg(pri, msg, from, flags) int msglen; char *timestamp; #ifdef __gnu_linux__ - sigset_t mask; + sigset_t mask, omask; + int lognum; #else #ifndef SYSV sigset_t omask; @@ -1771,7 +1782,7 @@ void logmsg(pri, msg, from, flags) sigemptyset(&mask); sigaddset(&mask, SIGHUP); sigaddset(&mask, SIGALRM); - sigprocmask(SIG_BLOCK, &mask, NULL); + sigprocmask(SIG_BLOCK, &mask, &omask); #else #ifndef SYSV omask = sigblock(sigmask(SIGHUP)|sigmask(SIGALRM)); @@ -1815,7 +1826,7 @@ void logmsg(pri, msg, from, flags) f->f_file = -1; } #ifdef __gnu_linux__ - sigprocmask(SIG_UNBLOCK, &mask, NULL); + sigprocmask(SIG_SETMASK, &omask, NULL); #else #ifndef SYSV (void) sigsetmask(omask); @@ -1884,7 +1895,7 @@ void logmsg(pri, msg, from, flags) } } #ifdef __gnu_linux__ - sigprocmask(SIG_UNBLOCK, &mask, NULL); + sigprocmask(SIG_SETMASK, &omask, NULL); #else #ifndef SYSV (void) sigsetmask(omask); @@ -2213,10 +2224,6 @@ void wallmsg(f, iov) if (fork() == 0) { (void) signal(SIGTERM, SIG_DFL); (void) alarm(0); -#ifndef SYSV - (void) signal(SIGTTOU, SIG_IGN); - (void) sigsetmask(0); -#endif (void) snprintf(greetings, sizeof(greetings), "\r\n\7Message from syslogd@%s at %.24s ...\r\n", (char *) iov[2].iov_base, ctime(&now)); @@ -2281,19 +2288,32 @@ void wallmsg(f, iov) reenter = 0; } +static sighandler_t resignal(int signum, sighandler_t handler) +{ + struct sigaction nact, oact; + sigset_t sigset; + + nact.sa_handler = handler; + sigemptyset (&nact.sa_mask); + + do { + if (sigaction(signum, &nact, &oact) == 0) + break; + } while (errno == EINTR); + + sigemptyset(&sigset); + sigaddset(&sigset, signum); + + sigprocmask(SIG_UNBLOCK, &sigset, NULL); + + return oact.sa_handler; +} + void reapchild() { int saved_errno = errno; -#if defined(SYSV) && !defined(linux) - (void) signal(SIGCHLD, reapchild); /* reset signal handler -ASP */ - wait ((int *)0); -#else while (waitpid(-1, (int*)0, WNOHANG|WUNTRACED) > 0) ; -#endif -#ifdef linux - (void) signal(SIGCHLD, reapchild); /* reset signal handler -ASP */ -#endif errno = saved_errno; } @@ -2403,6 +2423,7 @@ void domark() #ifdef SYSV for (lognum = 0; lognum <= nlogs; lognum++) { f = &Files[lognum]; + } #else for (f = Files; f; f = f->f_next) { #endif @@ -2414,8 +2435,6 @@ void domark() BACKOFF(f); } } - } - (void) signal(SIGALRM, domark); (void) alarm(TIMERINTVL); } @@ -2424,7 +2443,6 @@ void debug_switch() { dprintf("Switching debugging_on to %s\n", (debugging_on == 0) ? "true" : "false"); debugging_on = (debugging_on == 0) ? 1 : 0; - signal(SIGUSR1, debug_switch); } @@ -2774,7 +2792,6 @@ void init() logmsg(LOG_SYSLOG|LOG_INFO, "syslogd " VERSION "." PATCHLEVEL \ ": restart." , LocalHostName, ADDDATE); #endif - (void) signal(SIGHUP, sighup_handler); dprintf("syslogd: restarted.\n"); } #if FALSE @@ -3175,7 +3192,6 @@ static void allocate_log(void) void sighup_handler(int sig) { restart = 1; - signal(SIGHUP, sighup_handler); return; }