summaryrefslogtreecommitdiffstats
path: root/usr.bin/tmux/server.c
diff options
context:
space:
mode:
authornicm <nicm@openbsd.org>2017-07-12 10:04:51 +0000
committernicm <nicm@openbsd.org>2017-07-12 10:04:51 +0000
commit189d13937860467b4b4dfbb6491e99c0e61a343c (patch)
treeef4a8657a767ef8cd8d45551e05abd9b040d3757 /usr.bin/tmux/server.c
parentDo not call fo_ioctl() in syscall that do, or will, take the socket (diff)
downloadwireguard-openbsd-189d13937860467b4b4dfbb6491e99c0e61a343c.tar.xz
wireguard-openbsd-189d13937860467b4b4dfbb6491e99c0e61a343c.zip
Block signals between forking and clearing signal handlers (or calling
event_reinit) - if the child gets a signal and fires the libevent signal handler during this period it could write a signal into the parent's signal pipe. GitHub issue 1001 from Aaron van Geffen.
Diffstat (limited to 'usr.bin/tmux/server.c')
-rw-r--r--usr.bin/tmux/server.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/usr.bin/tmux/server.c b/usr.bin/tmux/server.c
index 2ca53f77839..fe565c18d28 100644
--- a/usr.bin/tmux/server.c
+++ b/usr.bin/tmux/server.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: server.c,v 1.174 2017/07/12 09:24:17 nicm Exp $ */
+/* $OpenBSD: server.c,v 1.175 2017/07/12 10:04:51 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -141,21 +141,24 @@ server_start(struct tmuxproc *client, struct event_base *base, int lockfd,
{
int pair[2];
struct job *job;
+ sigset_t set, oldset;
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pair) != 0)
fatal("socketpair failed");
+ sigfillset(&set);
+ sigprocmask(SIG_BLOCK, &set, &oldset);
switch (fork()) {
case -1:
fatal("fork failed");
case 0:
break;
default:
+ sigprocmask(SIG_SETMASK, &oldset, NULL);
close(pair[1]);
return (pair[0]);
}
close(pair[0]);
-
if (daemon(1, 0) != 0)
fatal("daemon failed");
proc_clear_signals(client);
@@ -163,6 +166,7 @@ server_start(struct tmuxproc *client, struct event_base *base, int lockfd,
fatalx("event_reinit failed");
server_proc = proc_start("server");
proc_set_signals(server_proc, server_signal);
+ sigprocmask(SIG_SETMASK, &oldset, NULL);
if (log_get_level() > 1)
tty_create_log();