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
This commit is contained in:
Junio C Hamano
2014-09-29 22:17:20 -07:00
3 changed files with 50 additions and 1 deletions

22
git.c
View File

@ -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);