Merge branch 'jk/refs-double-abort'

A corner case bug in the refs API has been corrected.

* jk/refs-double-abort:
  refs/files-backend: don't look at an aborted transaction
  refs/files-backend: handle packed transaction prepare failure
This commit is contained in:
Junio C Hamano
2019-04-16 19:28:11 +09:00
2 changed files with 31 additions and 1 deletions

View File

@ -2701,18 +2701,32 @@ static int files_transaction_prepare(struct ref_store *ref_store,
if (is_packed_transaction_needed(refs->packed_ref_store,
packed_transaction)) {
ret = ref_transaction_prepare(packed_transaction, err);
/*
* A failure during the prepare step will abort
* itself, but not free. Do that now, and disconnect
* from the files_transaction so it does not try to
* abort us when we hit the cleanup code below.
*/
if (ret) {
ref_transaction_free(packed_transaction);
backend_data->packed_transaction = NULL;
}
} else {
/*
* We can skip rewriting the `packed-refs`
* file. But we do need to leave it locked, so
* that somebody else doesn't pack a reference
* that we are trying to delete.
*
* We need to disconnect our transaction from
* backend_data, since the abort (whether successful or
* not) will free it.
*/
backend_data->packed_transaction = NULL;
if (ref_transaction_abort(packed_transaction, err)) {
ret = TRANSACTION_GENERIC_ERROR;
goto cleanup;
}
backend_data->packed_transaction = NULL;
}
}