On Wed, Oct 04, 2017 at 04:02:12AM -0400, Jeff King wrote:
> On Wed, Oct 04, 2017 at 04:19:52PM +0900, Junio C Hamano wrote:
>
> > * jt/partial-clone-lazy-fetch (2017-10-02) 18 commits
> [...]
>
> The merge of this topic into jch (at 766f92478b0) causes the test suite
> to fail when compiled with ASan/UBSan. The simplest reproduction I could
> come up with is:
>
> $ make SANITIZE=address,undefined BLK_SHA1=1 &&
> GIT_DIR=nope ./git shortlog </dev/null >/dev/null
> repository.c:69:31: runtime error: index 1869098813 out of bounds for type
> 'git_hash_algo [1]'
>
> Note that the series is fine by itself, it's only the merge which fails.
> Which implies to me it's some funny interaction with bc/hash-algo (which
> introduces the hash_algo concept). But I didn't dig further.
>
> +cc brian and Jonathan.
Actually, I take it back. Bisecting between "master" and "pu" turned up
that commit (and I verified that it fails at that commit but not at its
first parent).
But if I go directly to the tip of bc/hash-algo, I can see the failure
there. And it bisects to 67a9dfcc00 (hash-algo: integrate hash algorithm
support with repo setup, 2017-08-21).
So I think it's a read of uninitialized data, and it may come and go as
various topics tickle the compiler differently. And that would make
jt/partial-clone-lazy-fetch a red herring.
This seems to make it go away (on top of 67a9dfcc00):
diff --git a/setup.c b/setup.c
index 289e24811c..310afe9736 100644
--- a/setup.c
+++ b/setup.c
@@ -1126,7 +1126,9 @@ const char *setup_git_directory_gently(int *nongit_ok)
repo_set_gitdir(the_repository, gitdir);
setup_git_env();
}
- repo_set_hash_algo(the_repository, repo_fmt.hash_algo);
+ /* This is only valid if we actually found a repository */
+ if (startup_info->have_repository)
+ repo_set_hash_algo(the_repository, repo_fmt.hash_algo);
}
strbuf_release(&dir);
The problem is that we may not have a real repository at all, but we
still hit this code path, which tries to setup repository properties, if
there's a $GIT_DIR set.
I actually suspect this repo_set_hash_algo() line should go into
check_repository_format_gently(), where we set other globals (and which
should eventually take a pointer to struct repository rather than
touching the_repository).
But I'm sufficiently convinced now that this is just a bug in the
RFC-marked bc/hash-algo topic, and in no danger of graduating to master
soon.
-Peff