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:
22
git.c
22
git.c
@ -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);
|
||||
|
Reference in New Issue
Block a user