From b9fadeead74df1f4fa4a4177e478903d63e600f5 Mon Sep 17 00:00:00 2001 From: Justin Tobler Date: Thu, 20 Mar 2025 19:44:37 -0500 Subject: builtin/fetch: avoid aborting closed reference transaction As part of the reference transaction commit phase, the transaction is set to a closed state regardless of whether it was successful of not. Attempting to abort a closed transaction via `ref_transaction_abort()` results in a `BUG()`. In c92abe71df (builtin/fetch: fix leaking transaction with `--atomic`, 2024-08-22), logic to free a transaction after the commit phase is moved to the centralized exit path. In cases where the transaction commit failed, this results in a closed transaction being aborted and signaling a bug. Free the transaction and set it to NULL when the commit fails. This allows the exit path to correctly handle the error without attempting to abort the transaction. Signed-off-by: Justin Tobler Signed-off-by: Junio C Hamano --- builtin/fetch.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'builtin') diff --git a/builtin/fetch.c b/builtin/fetch.c index 80a64d0d26..5fb6d6bcf1 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -1732,8 +1732,15 @@ static int do_fetch(struct transport *transport, goto cleanup; retcode = ref_transaction_commit(transaction, &err); - if (retcode) + if (retcode) { + /* + * Explicitly handle transaction cleanup to avoid + * aborting an already closed transaction. + */ + ref_transaction_free(transaction); + transaction = NULL; goto cleanup; + } } commit_fetch_head(&fetch_head); -- cgit v1.3-5-g9baa