From: Jeff King <peff@peff.net>
To: Jonathon Mah <me@jonathonmah.com>
Cc: Junio C Hamano <gitster@pobox.com>, git@vger.kernel.org
Subject: Re: [PATCH 2/2] sha1_file: fix iterating loose alternate objects
Date: Mon, 2 Feb 2015 12:53:00 -0500 [thread overview]
Message-ID: <20150202175259.GA24025@peff.net> (raw)
In-Reply-To: <50251CB8-0885-40FF-A7C9-9C9460266E14@jonathonmah.com>
On Sun, Feb 01, 2015 at 01:55:33PM -0800, Jonathon Mah wrote:
> The string in 'base' contains a path suffix to a specific object; when
> its value is used, the suffix must either be filled (as in
> stat_sha1_file, open_sha1_file, check_and_freshen_nonlocal) or cleared
> (as in prepare_packed_git) to avoid junk at the end. loose_from_alt_odb
> (introduced in 660c889e46d185dc98ba78963528826728b0a55d) did neither and
> treated 'base' as a complete path to the "base" object directory,
> instead of a pointer to the "base" of the full path string.
>
> The trailing path after 'base' is still initialized to NUL, hiding the
> bug in some common cases. Additionally the descendent
> for_each_file_in_obj_subdir function swallows ENOENT, so an error only
> shows if the alternate's path was last filled with a valid object
> (where statting /path/to/existing/00/0bjectfile/00 fails).
Thanks for catching this, and for a nice explanation.
> diff --git a/sha1_file.c b/sha1_file.c
> index 30995e6..fcb1c4b 100644
> --- a/sha1_file.c
> +++ b/sha1_file.c
> @@ -3396,9 +3396,13 @@ static int loose_from_alt_odb(struct alternate_object_database *alt,
> void *vdata)
> {
> struct loose_alt_odb_data *data = vdata;
> - return for_each_loose_file_in_objdir(alt->base,
> - data->cb, NULL, NULL,
> - data->data);
> + int r;
> + alt->name[-1] = 0;
> + r = for_each_loose_file_in_objdir(alt->base,
> + data->cb, NULL, NULL,
> + data->data);
> + alt->name[-1] = '/';
> + return r;
> }
I think this is probably the best fix, and is the pattern we use
elsewhere when touching alt->base.
We _could_ further change this to have for_each_loose_file_in_objdir
actually use alt->base as its scratch buffer, writing the object
filenames into the end of it (i.e., what it was designed for). But:
1. We still need a strbuf scratch-buffer for the non-alternate object
directory. So we'd have to push more code there to over-allocate
the buffer, and then for_each_loose_file_in_objdir would assume
we always feed it a buffer with the extra slop. That would work,
but I find the strbuf approach a little safer; there's not an
implicit over-allocation far away in the code preventing us from
overflowing a buffer.
2. The reason for the existing alt->base behavior is that the
sha1_file code gets fed objects one at a time, and don't want to
pay strbuf overhead for each. With the iterator, we know we are
going to hit a bunch of objects, so we only have to pay the strbuf
overhead once for the iteration. So there's not the same
performance penalty, and we can stick with the strbuf if we prefer
it.
-Peff
next prev parent reply other threads:[~2015-02-02 17:53 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-01 21:55 [PATCH 1/2] t5710-info-alternate: demonstrate bug in unpacked pruning Jonathon Mah
2015-02-01 21:55 ` [PATCH 2/2] sha1_file: fix iterating loose alternate objects Jonathon Mah
2015-02-02 17:53 ` Jeff King [this message]
2015-02-02 18:37 ` Jonathon Mah
2015-02-02 17:56 ` [PATCH 1/2] t5710-info-alternate: demonstrate bug in unpacked pruning Jeff King
-- strict thread matches above, loose matches on Subject: below --
2015-02-09 1:12 [PATCH] sha1_file.c: make sure open_sha1_file does not open a directory Jeff King
2015-02-09 1:15 ` [PATCH 2/2] sha1_file: fix iterating loose alternate objects Jeff King
2015-02-09 9:44 ` Kyle J. McKay
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150202175259.GA24025@peff.net \
--to=peff@peff.net \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=me@jonathonmah.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).