[PATCH 0/2] fix clone guess_dir_name regression in v2.4.8
- From
Jeff King <peff@peff.net>
- Date
- Aug 5, 2015, 08:35 UTC
- Message-ID
- <20150805083526.GA22325@sigill.intra.peff.net>
- In-Reply-To
- <20150804224246.GA29051@sigill.intra.peff.net>
On Tue, Aug 04, 2015 at 06:42:46PM -0400, Jeff King wrote:
Show 8 quoted lines
> > I did not intend this change in behavior, and I can confirm that > > reverting my patch restores the original behavior. Thanks for bringing > > this to my attention, I'll work on a patch. > > I think this regression is in v2.4.8, as well. We should be able to use > a running "len" instead of the "end" pointer in the earlier part, and > then use strip_suffix_mem later (to strip from our already-reduced > length, rather than the full NUL-terminated string). Like this:
Looks like "git clone --bare host:foo/.git" is broken, too. I've added some tests to cover the recently broken cases, as well as some obvious normal cases (which the patch I sent earlier break!). And as a bonus, we can easily cover Patrick's root-repo problems (so people will actually run the tests, unlike the stuff in t1509. :) ).
Show 14 quoted lines
> @@ -167,14 +166,14 @@ static char *guess_dir_name(const char *repo, int is_bundle, int is_bare)
> * the form "remote.example.com:foo.git", i.e. no slash
> * in the directory part.
> */
> - start = end;
> + start = repo + len;
> while (repo < start && !is_dir_sep(start[-1]) && start[-1] != ':')
> start--;
>
> /*
> * Strip .{bundle,git}.
> */
> - strip_suffix(start, is_bundle ? ".bundle" : ".git" , &len);
> + strip_suffix_mem(start, &len, is_bundle ? ".bundle" : ".git");This is crap, of course. Our "len" variable is computed from the start of "repo", of which "start" is a subset. So we are indexing way out of bounds here.
As it turns out, this actually makes things simpler. We can stop using "len" entirely in the early part, and leave it as-is with pointer math (the patch I sent earlier did not really make anything simpler, anyway). And then we can just compute the length of "start" here, minus everything we've stripped off the end (i.e., "len = end - start").
Here are the patches.
[1/2]: clone: add tests for output directory [2/2]: clone: use computed length in guess_dir_name
-Peff