aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/tag.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2015-11-20 21:59:54 +0000
committerIngo Schwarze <schwarze@openbsd.org>2015-11-20 21:59:54 +0000
commita121fde484ea2d14b80a55edbc89155192ed5364 (patch)
tree82f0568c203cc75ebe3f11bea8cf457f2c2ce704 /tag.c
parent15be0ab8c964a27a1e5cfa3fdf7a8d5c5a94718b (diff)
downloadmandoc-a121fde484ea2d14b80a55edbc89155192ed5364.tar.gz
mandoc-a121fde484ea2d14b80a55edbc89155192ed5364.tar.zst
mandoc-a121fde484ea2d14b80a55edbc89155192ed5364.zip
Fix multiple issues regarding process group and signal mask handling
found by tb@ and millert@; parts of the code, in particular in tag.c, by millert@; OK millert@.
Diffstat (limited to 'tag.c')
-rw-r--r--tag.c29
1 files changed, 23 insertions, 6 deletions
diff --git a/tag.c b/tag.c
index 5766d540..57925ceb 100644
--- a/tag.c
+++ b/tag.c
@@ -1,4 +1,4 @@
-/* $Id: tag.c,v 1.10 2015/10/13 15:53:05 schwarze Exp $ */
+/* $Id: tag.c,v 1.11 2015/11/20 21:59:54 schwarze Exp $ */
/*
* Copyright (c) 2015 Ingo Schwarze <schwarze@openbsd.org>
*
@@ -50,10 +50,12 @@ static struct tag_files tag_files;
struct tag_files *
tag_init(void)
{
+ struct sigaction sa;
int ofd;
ofd = -1;
tag_files.tfd = -1;
+ tag_files.tcpgid = -1;
/* Save the original standard output for use by the pager. */
@@ -66,9 +68,12 @@ tag_init(void)
sizeof(tag_files.ofn));
(void)strlcpy(tag_files.tfn, "/tmp/man.XXXXXXXXXX",
sizeof(tag_files.tfn));
- signal(SIGHUP, tag_signal);
- signal(SIGINT, tag_signal);
- signal(SIGTERM, tag_signal);
+ memset(&sa, 0, sizeof(sa));
+ sigfillset(&sa.sa_mask);
+ sa.sa_handler = tag_signal;
+ sigaction(SIGHUP, &sa, NULL);
+ sigaction(SIGINT, &sa, NULL);
+ sigaction(SIGTERM, &sa, NULL);
if ((ofd = mkstemp(tag_files.ofn)) == -1)
goto fail;
if ((tag_files.tfd = mkstemp(tag_files.tfn)) == -1)
@@ -156,7 +161,15 @@ tag_write(void)
void
tag_unlink(void)
{
-
+ pid_t tc_pgid;
+
+ if (tag_files.tcpgid != -1) {
+ tc_pgid = tcgetpgrp(STDIN_FILENO);
+ if (tc_pgid == tag_files.pager_pid ||
+ tc_pgid == getpgid(0) ||
+ getpgid(tc_pgid) == -1)
+ (void)tcsetpgrp(STDIN_FILENO, tag_files.tcpgid);
+ }
if (*tag_files.ofn != '\0')
unlink(tag_files.ofn);
if (*tag_files.tfn != '\0')
@@ -166,9 +179,13 @@ tag_unlink(void)
static void
tag_signal(int signum)
{
+ struct sigaction sa;
tag_unlink();
- signal(signum, SIG_DFL);
+ memset(&sa, 0, sizeof(sa));
+ sigemptyset(&sa.sa_mask);
+ sa.sa_handler = SIG_DFL;
+ sigaction(signum, &sa, NULL);
kill(getpid(), signum);
/* NOTREACHED */
_exit(1);