From 6fae889a13757197c0180166c5518aea44a12a4c Mon Sep 17 00:00:00 2001 From: Leah Neukirchen Date: Fri, 14 Apr 2017 02:11:03 +0200 Subject: filter: block SIGPIPE during filtering --- filter.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/filter.c b/filter.c index 9784573..1a03598 100644 --- a/filter.c +++ b/filter.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -12,9 +13,16 @@ filter(char *input, size_t inlen, char *cmd, char **outputo, size_t *outleno) ssize_t outlen; ssize_t outalloc = 4096; pid_t pid; + sigset_t mask, orig_mask; + + sigemptyset(&mask); + sigaddset(&mask, SIGPIPE); + sigprocmask(SIG_BLOCK, &mask, &orig_mask); - output = malloc(outalloc); outlen = 0; + output = malloc(outalloc); + if (!output) + goto fail; int pipe0[2]; int pipe1[2]; @@ -95,6 +103,9 @@ filter(char *input, size_t inlen, char *cmd, char **outputo, size_t *outleno) *outputo = output; *outleno = outlen; + sigwaitinfo(&mask, 0); + sigprocmask(SIG_SETMASK, &orig_mask, 0); + return WEXITSTATUS(status); fail: @@ -102,6 +113,9 @@ fail: *outleno = 0; free(output); + sigwaitinfo(&mask, 0); + sigprocmask(SIG_SETMASK, &orig_mask, 0); + return -1; } -- cgit 1.4.1