Jeff King wrote:

> When we are streaming an index blob to disk, we store the
> error from stream_blob_to_fd in the "result" variable, and
> then immediately overwrite that with the return value of
> "close".

Good catch.

[...]
> --- a/entry.c
> +++ b/entry.c
> @@ -126,8 +126,10 @@ static int streaming_write_entry(struct cache_entry *ce, 
> char *path,
>       fd = open_output_fd(path, ce, to_tempfile);
>       if (0 <= fd) {
>               result = stream_blob_to_fd(fd, ce->sha1, filter, 1);
> -             *fstat_done = fstat_output(fd, state, statbuf);
> -             result = close(fd);
> +             if (!result) {
> +                     *fstat_done = fstat_output(fd, state, statbuf);
> +                     result = close(fd);
> +             }

Should this do something like


        {
                int fd, result = 0;

                fd = open_output_fd(path, ce, to_tempfile);
                if (fd < 0)
                        return -1;

                result = stream_blob_to_fd(fd, ce->sha1, filter, 1);
                if (result)
                        goto close_fd;

                *fstat_done = fstat_output(fd, state, statbuf);
        close_fd:
                result |= close(fd);
        unlink_path:
                if (result)
                        unlink(path);
                return result;
        }

to avoid leaking the file descriptor?

> @@ -31,4 +40,20 @@ test_expect_success 'streaming a corrupt blob fails' '
>       )
>  '
>  
> +test_expect_success 'read-tree -u detects bit-errors in blobs' '
> +     (
> +             cd bit-error &&
> +             rm content.t &&
> +             test_must_fail git read-tree --reset -u FETCH_HEAD
> +     )

Makes sense.  Might make sense to use "rm -f" instead of "rm" to avoid
failures if content.t is removed already.

> +'
> +
> +test_expect_success 'read-tree -u detects missing objects' '
> +     (
> +             cd missing &&
> +             rm content.t &&

Especially here.

Thanks,
Jonathan
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to