diff options
author | Leah Neukirchen <leah@vuxu.org> | 2017-04-14 02:11:03 +0200 |
---|---|---|
committer | Leah Neukirchen <leah@vuxu.org> | 2017-04-14 02:11:03 +0200 |
commit | 6fae889a13757197c0180166c5518aea44a12a4c (patch) | |
tree | 3e7f38c75aa69baf0e85d0e87ebece9f1c5b6c5b | |
parent | 07a60a3908c70e7504e57883d19512f78d42df28 (diff) | |
download | mblaze-6fae889a13757197c0180166c5518aea44a12a4c.tar.gz mblaze-6fae889a13757197c0180166c5518aea44a12a4c.tar.xz mblaze-6fae889a13757197c0180166c5518aea44a12a4c.zip |
filter: block SIGPIPE during filtering
-rw-r--r-- | filter.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/filter.c b/filter.c index 9784573..1a03598 100644 --- a/filter.c +++ b/filter.c @@ -1,4 +1,5 @@ #include <poll.h> +#include <signal.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -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; } |