summaryrefslogtreecommitdiff
path: root/libexec
diff options
context:
space:
mode:
authorHenning Brauer <henning@cvs.openbsd.org>2004-11-29 22:24:58 +0000
committerHenning Brauer <henning@cvs.openbsd.org>2004-11-29 22:24:58 +0000
commitf485a9db639f9d57b74971e2bcec8204339c69d0 (patch)
treebb1a336400dee6af9559b0cf1b5c4208676f9da4 /libexec
parentb5bb7ac498f4a1b68bc1e27d4729519fff179230 (diff)
fix nasty signal races by blocking signals in signal handlers.
with moritz jodeit and theo, ok theo
Diffstat (limited to 'libexec')
-rw-r--r--libexec/ftpd/monitor.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/libexec/ftpd/monitor.c b/libexec/ftpd/monitor.c
index ef4157238e4..ff9692ddf2a 100644
--- a/libexec/ftpd/monitor.c
+++ b/libexec/ftpd/monitor.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: monitor.c,v 1.3 2004/11/28 20:09:47 henning Exp $ */
+/* $OpenBSD: monitor.c,v 1.4 2004/11/29 22:24:57 henning Exp $ */
/*
* Copyright (c) 2004 Moritz Jodeit <moritz@jodeit.org>
@@ -378,11 +378,16 @@ handle_cmds(void)
void
sig_pass_to_slave(int signo)
{
+ sigset_t allsigs, oldsigs;
int olderrno = errno;
+ sigfillset(&allsigs);
+ sigprocmask(SIG_BLOCK, &allsigs, &oldsigs);
+
if (slave_pid > 0)
kill(slave_pid, signo);
+ sigprocmask(SIG_SETMASK, &oldsigs, NULL);
errno = olderrno;
}
@@ -391,8 +396,12 @@ void
sig_chld(int signo)
{
pid_t pid;
+ sigset_t allsigs, oldsigs;
int stat, olderrno = errno;
+ sigfillset(&allsigs);
+ sigprocmask(SIG_BLOCK, &allsigs, &oldsigs);
+
do {
pid = waitpid(-1, &stat, WNOHANG);
} while (pid == -1 && errno == EINTR);
@@ -402,6 +411,7 @@ sig_chld(int signo)
slave_pid = -1;
}
+ sigprocmask(SIG_SETMASK, &oldsigs, NULL);
errno = olderrno;
}