diff options
| author | Patrick Steinhardt <ps@pks.im> | 2026-06-25 11:20:09 +0200 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2026-06-26 08:27:19 -0700 |
| commit | d6522d01dfd147d18246d308dd6ea24b32d095d2 (patch) | |
| tree | f8c903355932c46c7032a287449f88be6edaffdb | |
| parent | 79fa75d499d767540fae8d85ab62391cae6591f9 (diff) | |
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>
| -rw-r--r-- | refs.c | 7 |
1 files changed, 7 insertions, 0 deletions
@@ -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; } |
