refs: protect against chicken-and-egg recursion

In the preceding commits we have fixed recursion when creating the
reference backends due to a chicken-and-egg situation with "onbranch"
conditions. Unfortunately, this issue has existed for a while, and we
didn't really have a good mechanism to detect this recursion.

Improve the status quo by detecting the recursion when creating the main
reference store.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
next
Patrick Steinhardt 2026-06-25 11:20:09 +02:00 committed by Junio C Hamano
parent 79fa75d499
commit d6522d01df
1 changed files with 7 additions and 0 deletions

7
refs.c
View File

@ -2359,15 +2359,22 @@ void ref_store_release(struct ref_store *ref_store)

struct ref_store *get_main_ref_store(struct repository *r)
{
static bool initializing;

if (r->refs_private)
return r->refs_private;

if (!r->gitdir)
BUG("attempting to get main_ref_store outside of repository");
if (initializing)
BUG("initialization of main ref store is recursing");

initializing = true;
r->refs_private = ref_store_init(r, r->ref_storage_format,
r->gitdir, REF_STORE_ALL_CAPS);
r->refs_private = maybe_debug_wrap_ref_store(r->gitdir, r->refs_private);
initializing = false;

return r->refs_private;
}