threads / patch / 38211

patchBad file descriptor on filtering empty files

Subject: [PATCH] Bad file descriptor on filtering empty files

## tl;dr

2 messages between Dec 19, 2014 and Dec 22, 2014. Diffs are folded; open one to read it.

replies: 1people: 2as markdown or json

William Throwe· Dec 19, 2014, 22:41 UTC · lore

In git 2.2.0 (also tested on 2.2.0.65.g9abc44b), if an external smudge/clean filter is called on an empty file git reports something like: error: copy-fd: read returned Bad file descriptor error: cannot feed the input to external filter cat error: external filter cat failed

Test case:

mkdir bug cd bug git init git config filter.cat.clean cat git config filter.cat.smudge cat echo '* filter=cat' >.gitattributes touch a git add a

This started in 9035d75a2be9d80d82676504d69553245017f6d4, which introduced the possible call to copy_fd in code called from apply_filter. It appears that NULL as the src argument to apply_filter is being used both as a sentinel value to indicate that the fd should be used instead and also as a representation of the contents of an empty file. I suggest switching to using fd == -1 as the sentinel as shown in the patch below.

Thanks, Will

Show changes to convert.c +1 −1
diff --git a/convert.c b/convert.c
index 9a5612e..0509ac1 100644
--- a/convert.c
+++ b/convert.c
@@ -355,7 +355,7 @@ static int filter_buffer_or_fd(int in, int out, void *data)
 
 	sigchain_push(SIGPIPE, SIG_IGN);
 
-	if (params->src) {
+	if (params->fd == -1) {
 		write_err = (write_in_full(child_process.in, params->src, params->size) < 0);
 	} else {
 		write_err = copy_fd(params->fd, child_process.in);
Junio C Hamano· Dec 22, 2014, 18:26 UTC · re: William Throwe · lore

Re: [PATCH] Bad file descriptor on filtering empty files

William Throwe <wtt6@cornell.edu> writes:
Show 30 quoted lines
> In git 2.2.0 (also tested on 2.2.0.65.g9abc44b), if an external
> smudge/clean filter is called on an empty file git reports something
> like:
> error: copy-fd: read returned Bad file descriptor
> error: cannot feed the input to external filter cat
> error: external filter cat failed
>
> Test case:
>
> mkdir bug
> cd bug
> git init
> git config filter.cat.clean cat
> git config filter.cat.smudge cat
> echo '* filter=cat' >.gitattributes
> touch a
> git add a
>
>
> This started in 9035d75a2be9d80d82676504d69553245017f6d4, which
> introduced the possible call to copy_fd in code called from
> apply_filter.  It appears that NULL as the src argument to apply_filter
> is being used both as a sentinel value to indicate that the fd should be
> used instead and also as a representation of the contents of an empty
> file.  I suggest switching to using fd == -1 as the sentinel as shown in
> the patch below.
>
> Thanks,
> Will
>
William, thanks for raising this issue.
Steffen, comments?
Show 13 quoted lines
> diff --git a/convert.c b/convert.c
> index 9a5612e..0509ac1 100644
> --- a/convert.c
> +++ b/convert.c
> @@ -355,7 +355,7 @@ static int filter_buffer_or_fd(int in, int out, void *data)
>  
>  	sigchain_push(SIGPIPE, SIG_IGN);
>  
> -	if (params->src) {
> +	if (params->fd == -1) {
>  		write_err = (write_in_full(child_process.in, params->src, params->size) < 0);
>  	} else {
>  		write_err = copy_fd(params->fd, child_process.in);

← back to recent threads