From 0453ad01468460d5fca09457ed7c862685076931 Mon Sep 17 00:00:00 2001 From: nicm Date: Wed, 12 Jul 2017 09:24:17 +0000 Subject: Move signal code into proc.c. --- cmd-pipe-pane.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'cmd-pipe-pane.c') diff --git a/cmd-pipe-pane.c b/cmd-pipe-pane.c index 1e4e0ea4..bb7630c0 100644 --- a/cmd-pipe-pane.c +++ b/cmd-pipe-pane.c @@ -111,7 +111,7 @@ cmd_pipe_pane_exec(struct cmd *self, struct cmdq_item *item) case 0: /* Child process. */ close(pipe_fd[0]); - clear_signals(1); + proc_clear_signals(server_proc); if (dup2(pipe_fd[1], STDIN_FILENO) == -1) _exit(1); -- cgit v1.2.3 From 51112221eeb31ced907f0dfcf077582996c20c07 Mon Sep 17 00:00:00 2001 From: nicm Date: Wed, 12 Jul 2017 10:04:51 +0000 Subject: 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. --- cmd-pipe-pane.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'cmd-pipe-pane.c') diff --git a/cmd-pipe-pane.c b/cmd-pipe-pane.c index bb7630c0..c2ec3ac3 100644 --- a/cmd-pipe-pane.c +++ b/cmd-pipe-pane.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -62,6 +63,7 @@ cmd_pipe_pane_exec(struct cmd *self, struct cmdq_item *item) char *cmd; int old_fd, pipe_fd[2], null_fd; struct format_tree *ft; + sigset_t set, oldset; /* Destroy the old pipe. */ old_fd = wp->pipe_fd; @@ -102,16 +104,20 @@ cmd_pipe_pane_exec(struct cmd *self, struct cmdq_item *item) format_free(ft); /* Fork the child. */ + sigfillset(&set); + sigprocmask(SIG_BLOCK, &set, &oldset); switch (fork()) { case -1: + sigprocmask(SIG_SETMASK, &oldset, NULL); cmdq_error(item, "fork error: %s", strerror(errno)); free(cmd); return (CMD_RETURN_ERROR); case 0: /* Child process. */ - close(pipe_fd[0]); proc_clear_signals(server_proc); + sigprocmask(SIG_SETMASK, &oldset, NULL); + close(pipe_fd[0]); if (dup2(pipe_fd[1], STDIN_FILENO) == -1) _exit(1); @@ -132,6 +138,7 @@ cmd_pipe_pane_exec(struct cmd *self, struct cmdq_item *item) _exit(1); default: /* Parent process. */ + sigprocmask(SIG_SETMASK, &oldset, NULL); close(pipe_fd[1]); wp->pipe_fd = pipe_fd[0]; -- cgit v1.2.3