filter: block SIGPIPE during filtering

pull/28/head
Leah Neukirchen 7 years ago
parent 07a60a3908
commit 6fae889a13

@ -1,4 +1,5 @@
#include <poll.h> #include <poll.h>
#include <signal.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.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 outlen;
ssize_t outalloc = 4096; ssize_t outalloc = 4096;
pid_t pid; pid_t pid;
sigset_t mask, orig_mask;
sigemptyset(&mask);
sigaddset(&mask, SIGPIPE);
sigprocmask(SIG_BLOCK, &mask, &orig_mask);
output = malloc(outalloc);
outlen = 0; outlen = 0;
output = malloc(outalloc);
if (!output)
goto fail;
int pipe0[2]; int pipe0[2];
int pipe1[2]; int pipe1[2];
@ -95,6 +103,9 @@ filter(char *input, size_t inlen, char *cmd, char **outputo, size_t *outleno)
*outputo = output; *outputo = output;
*outleno = outlen; *outleno = outlen;
sigwaitinfo(&mask, 0);
sigprocmask(SIG_SETMASK, &orig_mask, 0);
return WEXITSTATUS(status); return WEXITSTATUS(status);
fail: fail:
@ -102,6 +113,9 @@ fail:
*outleno = 0; *outleno = 0;
free(output); free(output);
sigwaitinfo(&mask, 0);
sigprocmask(SIG_SETMASK, &orig_mask, 0);
return -1; return -1;
} }

Loading…
Cancel
Save