From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from localhost (fantadrom.bsd.lv [local]); by fantadrom.bsd.lv (OpenSMTPD) with ESMTPA id e355e73f; for ; Tue, 17 Mar 2015 02:33:37 -0500 (EST) Date: Tue, 17 Mar 2015 02:33:37 -0500 (EST) Message-Id: <2066483516209013163.enqueue@fantadrom.bsd.lv> X-Mailinglist: mdocml-source Reply-To: source@mdocml.bsd.lv MIME-Version: 1.0 From: schwarze@mdocml.bsd.lv To: source@mdocml.bsd.lv Subject: mdocml: When the user exits the pager before the pager has drained all X-Mailer: activitymail 1.26, http://search.cpan.org/dist/activitymail/ Content-Type: text/plain; charset=utf-8 Log Message: ----------- 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@. Modified Files: -------------- mdocml: main.c read.c Revision Data ------------- Index: main.c =================================================================== RCS file: /home/cvs/mdocml/mdocml/main.c,v retrieving revision 1.225 retrieving revision 1.226 diff -Lmain.c -Lmain.c -u -p -r1.225 -r1.226 --- main.c +++ main.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -92,6 +93,7 @@ static int fs_lookup(const struct man static void fs_search(const struct mansearch *, const struct manpaths *, int, char**, struct manpage **, size_t *); +static void handle_sigpipe(int); static int koptions(int *, char *); #if HAVE_SQLITE3 int mandocdb(int, char**); @@ -111,6 +113,7 @@ static const int sec_prios[] = {1, 4, 5, static char help_arg[] = "help"; static char *help_argv[] = {help_arg, NULL}; static const char *progname; +static enum mandoclevel rc; int @@ -127,7 +130,7 @@ main(int argc, char *argv[]) size_t isec, i, sz; int prio, best_prio, synopsis_only; char sec; - enum mandoclevel rc, rctmp; + enum mandoclevel rctmp; enum outmode outmode; int fd; int show_usage; @@ -940,6 +943,13 @@ mmsg(enum mandocerr t, enum mandoclevel fputc('\n', stderr); } +static void +handle_sigpipe(int signum) +{ + + exit(rc); +} + static pid_t spawn_pager(void) { @@ -972,6 +982,7 @@ spawn_pager(void) exit((int)MANDOCLEVEL_SYSERR); } close(fildes[1]); + signal(SIGPIPE, handle_sigpipe); return(pager_pid); } Index: read.c =================================================================== RCS file: /home/cvs/mdocml/mdocml/read.c,v retrieving revision 1.131 retrieving revision 1.132 diff -Lread.c -Lread.c -u -p -r1.131 -r1.132 --- read.c +++ read.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -846,6 +847,7 @@ mparse_open(struct mparse *curp, int *fd perror("dup"); exit((int)MANDOCLEVEL_SYSERR); } + signal(SIGPIPE, SIG_DFL); execlp("gunzip", "gunzip", "-c", file, NULL); perror("exec"); exit((int)MANDOCLEVEL_SYSERR); -- To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv