Index: daemon.c
===================================================================
RCS file: /cvs/sendmail/daemon.c,v
retrieving revision 8.401.4.61
diff -u -r8.401.4.61 daemon.c
--- daemon.c	2001/05/27 22:14:40	8.401.4.61
+++ daemon.c	2001/06/26 01:22:11
@@ -2564,15 +2563,38 @@
 **		restarts the daemon or exits if restart fails.
 */
 
+/* ARGSUSED */
+static SIGFUNC_DECL
+sm_signal_noop(sig)
+	int sig;
+{
+	int save_errno = errno;
+
+	FIX_SYSV_SIGNAL(sig, sm_signal_noop);
+	errno = save_errno;
+	return SIGFUNC_RETURN;
+}
+
+/* Make a non-DFL/IGN signal a noop */
+#define SM_NOOP_SIGNAL(sig, old)				\
+do								\
+{								\
+	(old) = setsignal((sig), sm_signal_noop);		\
+	if ((old) == SIG_IGN || (old) == SIG_DFL)		\
+		(void) setsignal((sig), (old));			\
+} while (0)
+
 static void
 restart_daemon()
 {
 	int i;
 	int save_errno;
 	char *reason;
-	sigfunc_t oalrm, ochld, ohup, oint, opipe, oterm, ousr1;
+	sigfunc_t ignore, oalrm, ousr1;
 	extern int DtableSize;
 
+	/* clear the events to turn off SIGALRMs */
+	clear_events();
 	allsignals(TRUE);
 
 	reason = RestartRequest;
@@ -2612,28 +2634,37 @@
 			(void) fcntl(i, F_SETFD, j | FD_CLOEXEC);
 	}
 
-	/* need to allow signals before execve() so make them harmless */
-	oalrm = setsignal(SIGALRM, SIG_DFL);
-	ochld = setsignal(SIGCHLD, SIG_DFL);
-	ohup = setsignal(SIGHUP, SIG_DFL);
-	oint = setsignal(SIGINT, SIG_DFL);
-	opipe = setsignal(SIGPIPE, SIG_DFL);
-	oterm = setsignal(SIGTERM, SIG_DFL);
-	ousr1 = setsignal(SIGUSR1, SIG_DFL);
+	/*
+	**  Need to allow signals before execve() to make them "harmless".
+	**  However, the default action can be "terminate", so it isn't
+	**  really harmless.  Setting signals to IGN will cause them to be
+	**  ignored in the new process to, so that isn't a good alternative.
+	*/
+
+	SM_NOOP_SIGNAL(SIGALRM, oalrm);
+	SM_NOOP_SIGNAL(SIGCHLD, ignore);
+	SM_NOOP_SIGNAL(SIGHUP, ignore);
+	SM_NOOP_SIGNAL(SIGINT, ignore);
+	SM_NOOP_SIGNAL(SIGPIPE, ignore);
+	SM_NOOP_SIGNAL(SIGTERM, ignore);
+#ifdef SIGUSR1
+	SM_NOOP_SIGNAL(SIGUSR1, ousr1);
+#endif /* SIGUSR1 */
 	allsignals(FALSE);
 
 	(void) execve(SaveArgv[0], (ARGV_T) SaveArgv, (ARGV_T) ExternalEnviron);
 	save_errno = errno;
 
-	/* restore signals */
+	/* block signals again and restore needed signals */
 	allsignals(TRUE);
+
+	/* For finis() events */
 	(void) setsignal(SIGALRM, oalrm);
-	(void) setsignal(SIGCHLD, ochld);
-	(void) setsignal(SIGHUP, ohup);
-	(void) setsignal(SIGINT, oint);
-	(void) setsignal(SIGPIPE, opipe);
-	(void) setsignal(SIGTERM, oterm);
+
+#ifdef SIGUSR1
+	/* For debugging finis() */
 	(void) setsignal(SIGUSR1, ousr1);
+#endif /* SIGUSR1 */
 
 	errno = save_errno;
 	if (LogLevel > 0)

