On Tue, Feb 06, 2018 at 12:36:15PM -0800, Jonathan Tan wrote: > In commit 42c7f7ff9685 ("commit_packed_refs(): remove call to > `packed_refs_unlock()`", 2017-06-23), a call to packed_refs_unlock() was > added to files_initial_transaction_commit() in order to compensate for > removing that call from commit_packed_refs(). However, that call was > added in the cleanup section, which is run even if the packed_ref_store > was never locked (which happens if an error occurs earlier in the > function). > > Create a new cleanup goto target which runs packed_refs_unlock(), and > ensure that only goto statements after a successful invocation of > packed_refs_lock() jump there. The explanation and patch look good to me. But this all seemed strangely familiar... I think this is the same bug as: https://public-inbox.org/git/20180118143841.1a4c674d@novascotia/ which is queued as mr/packed-ref-store-fix. It's listed as "will merge to next" in the "what's cooking" from Jan 31st. > diff --git a/refs/files-backend.c b/refs/files-backend.c > index f75d960e1..89bc5584a 100644 > --- a/refs/files-backend.c > +++ b/refs/files-backend.c > @@ -2931,13 +2931,14 @@ static int files_initial_transaction_commit(struct ref_store *ref_store, > > if (initial_ref_transaction_commit(packed_transaction, err)) { > ret = TRANSACTION_GENERIC_ERROR; > - goto cleanup; > + goto locked_cleanup; > } > > +locked_cleanup: > + packed_refs_unlock(refs->packed_ref_store); > cleanup: > if (packed_transaction) > ref_transaction_free(packed_transaction); > - packed_refs_unlock(refs->packed_ref_store); I actually like this double-label a bit more than what is queued on mr/packed-ref-store-fix, though I am OK with either solution. -Peff