filter_buffer_or_fd(): ignore EPIPE
We are explicitly ignoring SIGPIPE, as we fully expect that the filter program may not read our output fully. Ignore EPIPE that may come from writing to it as well. A new test was stolen from Jeff's suggestion. Helped-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
00b7cbfcb3
commit
0c4dd67a04
@ -356,9 +356,14 @@ static int filter_buffer_or_fd(int in, int out, void *data)
|
||||
sigchain_push(SIGPIPE, SIG_IGN);
|
||||
|
||||
if (params->src) {
|
||||
write_err = (write_in_full(child_process.in, params->src, params->size) < 0);
|
||||
write_err = (write_in_full(child_process.in,
|
||||
params->src, params->size) < 0);
|
||||
if (errno == EPIPE)
|
||||
write_err = 0;
|
||||
} else {
|
||||
write_err = copy_fd(params->fd, child_process.in);
|
||||
if (write_err == COPY_WRITE_ERROR && errno == EPIPE)
|
||||
write_err = 0;
|
||||
}
|
||||
|
||||
if (close(child_process.in))
|
||||
|
@ -204,6 +204,16 @@ test_expect_success 'filtering large input to small output should use little mem
|
||||
GIT_MMAP_LIMIT=1m GIT_ALLOC_LIMIT=1m git add 30MB
|
||||
'
|
||||
|
||||
test_expect_success 'filter that does not read is fine' '
|
||||
test-genrandom foo $((128 * 1024 + 1)) >big &&
|
||||
echo "big filter=epipe" >.gitattributes &&
|
||||
git config filter.epipe.clean "echo xyzzy" &&
|
||||
git add big &&
|
||||
git cat-file blob :big >actual &&
|
||||
echo xyzzy >expect &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success EXPENSIVE 'filter large file' '
|
||||
git config filter.largefile.smudge cat &&
|
||||
git config filter.largefile.clean cat &&
|
||||
|
Loading…
Reference in New Issue
Block a user