summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJehan Bing <jehan@orb.com>2012-02-20 12:53:37 -0800
committerJunio C Hamano <gitster@pobox.com>2012-02-21 12:48:09 -0800
commit6424c2ad12cf6c3feb533fab9c4dded7514d0f4c (patch)
treeb2916a0d9514481abda8642dd871e5f2360a9f03
parentd0482e88a735787f7bb33ef4783be0e7f6a70946 (diff)
downloadgit-jb/filter-ignore-sigpipe.tar.gz
Ignore SIGPIPE when running a filter driverjb/filter-ignore-sigpipe
If a filter is not defined or if it fails, git should behave as if the filter is a no-op passthru. However, if the filter exits before reading all the content, depending on the timing, git could be killed with SIGPIPE when it tries to write to the pipe connected to the filter. Ignore SIGPIPE while processing the filter to give us a chance to check the return value from a failed write, in order to detect and act on this mode of failure in a more controlled way. Signed-off-by: Jehan Bing <jehan@orb.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--convert.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/convert.c b/convert.c
index 12868ed7bd..33373b3ac0 100644
--- a/convert.c
+++ b/convert.c
@@ -2,6 +2,7 @@
#include "attr.h"
#include "run-command.h"
#include "quote.h"
+#include "sigchain.h"
/*
* convert.c - convert a file when checking it out and checking it in.
@@ -360,12 +361,16 @@ static int filter_buffer(int in, int out, void *data)
if (start_command(&child_process))
return error("cannot fork to run external filter %s", params->cmd);
+ sigchain_push(SIGPIPE, SIG_IGN);
+
write_err = (write_in_full(child_process.in, params->src, params->size) < 0);
if (close(child_process.in))
write_err = 1;
if (write_err)
error("cannot feed the input to external filter %s", params->cmd);
+ sigchain_pop(SIGPIPE);
+
status = finish_command(&child_process);
if (status)
error("external filter %s failed %d", params->cmd, status);