aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/read.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2015-03-17 07:33:07 +0000
committerIngo Schwarze <schwarze@openbsd.org>2015-03-17 07:33:07 +0000
commit9ef16b96be75b66de146889e69c4b0130a151f7c (patch)
tree9d76d19fb3c50fd84c2ed518bd1e2810199a9254 /read.c
parent6f012a44632546e74fbbe0018e81fd78f3f61049 (diff)
downloadmandoc-9ef16b96be75b66de146889e69c4b0130a151f7c.tar.gz
mandoc-9ef16b96be75b66de146889e69c4b0130a151f7c.tar.zst
mandoc-9ef16b96be75b66de146889e69c4b0130a151f7c.zip
When the user exits the pager before the pager has drained all input
from man(1), man(1) dies from SIGPIPE. Exiting man(1) is fine in this case, generating more output would be pointless, but without handling SIGPIPE, the exit code from man(1) was wrong and csh(1) printed an ugly message "Broken pipe". Fix this by handling SIGPIPE explicitly. Issue noticed by deraadt@.
Diffstat (limited to 'read.c')
-rw-r--r--read.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/read.c b/read.c
index 471d4150..397e6cd7 100644
--- a/read.c
+++ b/read.c
@@ -1,4 +1,4 @@
-/* $Id: read.c,v 1.131 2015/03/11 13:05:20 schwarze Exp $ */
+/* $Id: read.c,v 1.132 2015/03/17 07:33:07 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010-2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -29,6 +29,7 @@
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
+#include <signal.h>
#include <stdarg.h>
#include <stdint.h>
#include <stdio.h>
@@ -846,6 +847,7 @@ mparse_open(struct mparse *curp, int *fd, const char *file)
perror("dup");
exit((int)MANDOCLEVEL_SYSERR);
}
+ signal(SIGPIPE, SIG_DFL);
execlp("gunzip", "gunzip", "-c", file, NULL);
perror("exec");
exit((int)MANDOCLEVEL_SYSERR);