On 03/01/2017 01:00 PM, Duy Nguyen wrote:
> On Wed, Mar 1, 2017 at 1:03 AM, Michael Haggerty <[email protected]> wrote:
>>> struct ref_store *get_ref_store(const char *submodule)
>>> {
>>> struct strbuf submodule_sb = STRBUF_INIT;
>>> @@ -1480,6 +1479,9 @@ struct ref_store *get_ref_store(const char *submodule)
>>> if (is_nonbare_repository_dir(&submodule_sb))
>>> refs = ref_store_init(submodule);
>>> strbuf_release(&submodule_sb);
>>> +
>>> + if (refs)
>>
>> I think `refs` should always be non-NULL here for the same reason.
>
> That's true if is_nonbar_repo... returns true. If it's false (e.g.
> uninitialized submodule) then refs remains NULL from before (I didn't
> know about this until I hit a segfault in rev-list in another series)
Oh, yes, true.
But given that, I think the code would be clearer if the two calls were
in the same if; i.e.,
refs = lookup_submodule_ref_store(submodule);
if (refs)
return refs;
strbuf_addstr(&submodule_sb, submodule);
if (is_nonbare_repository_dir(&submodule_sb)) {
refs = ref_store_init(submodule);
register_submodule_ref_store(refs, submodule);
}
strbuf_release(&submodule_sb);
return refs;
or even the `if (!is_nonbare_repository_dir(...)) goto cleanup;` pattern
to make it clearer that this is an error return.
Michael