diff options
author | Junio C Hamano <gitster@pobox.com> | 2014-09-29 22:17:20 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2014-09-29 22:17:20 -0700 |
commit | 131f0315c46c30d5a9e6743354808230cf4908c0 (patch) | |
tree | 6ea66a6881020352074d813761e7af5fd0d2ed27 /git.c | |
parent | 0bf7dd652cd7b7d3900e6aed73a97cf2c4978fee (diff) | |
parent | 4e6d207c45e6f5c13b38c4a200f0d3339f88ad34 (diff) | |
download | git-131f0315c46c30d5a9e6743354808230cf4908c0.tar.gz |
Merge branch 'pr/use-default-sigpipe-setting'
We used to get confused when a process called us with SIGPIPE
ignored; we do want to die with SIGPIPE when the output is not
read by default, and do ignore the signal when appropriate.
* pr/use-default-sigpipe-setting:
mingw.h: add dummy functions for sigset_t operations
unblock and unignore SIGPIPE
Diffstat (limited to 'git.c')
-rw-r--r-- | git.c | 22 |
1 files changed, 22 insertions, 0 deletions
@@ -592,6 +592,26 @@ static int run_argv(int *argcp, const char ***argv) return done_alias; } +/* + * Many parts of Git have subprograms communicate via pipe, expect the + * upstream of a pipe to die with SIGPIPE when the downstream of a + * pipe does not need to read all that is written. Some third-party + * programs that ignore or block SIGPIPE for their own reason forget + * to restore SIGPIPE handling to the default before spawning Git and + * break this carefully orchestrated machinery. + * + * Restore the way SIGPIPE is handled to default, which is what we + * expect. + */ +static void restore_sigpipe_to_default(void) +{ + sigset_t unblock; + + sigemptyset(&unblock); + sigaddset(&unblock, SIGPIPE); + sigprocmask(SIG_UNBLOCK, &unblock, NULL); + signal(SIGPIPE, SIG_DFL); +} int main(int argc, char **av) { @@ -611,6 +631,8 @@ int main(int argc, char **av) */ sanitize_stdfds(); + restore_sigpipe_to_default(); + git_setup_gettext(); trace_command_performance(argv); |