Skip to content

Commit

Permalink
Ignore SIGPIPE when running a filter driver
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jehan Bing authored and Junio C Hamano committed Feb 21, 2012
1 parent d0482e8 commit 6424c2a
Showing 1 changed file with 5 additions and 0 deletions.
5 changes: 5 additions & 0 deletions convert.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 6424c2a

Please sign in to comment.