# [PATCH] refs/reftable: fix leak when copying reflog fails

2 messages from 2024-02-08 to 2024-02-15. Participants: Patrick Steinhardt, Jeff King.
Thread: https://gitlist.dev/t/60872

## Patrick Steinhardt, 2024-02-08 05:26

Subject: [PATCH] refs/reftable: fix leak when copying reflog fails
Message-ID: <02f7a97a451927f9a7ee06f3c5ea5af4c4eb6645.1707369907.git.ps@pks.im>
URL: https://gitlist.dev/e/02f7a97a451927f9a7ee06f3c5ea5af4c4eb6645.1707369907.git.ps%40pks.im

```
When copying a ref with the reftable backend we also copy the
corresponding log records. When seeking the first log record that we're
about to copy fails though we directly return from `write_copy_table()`
without doing any cleanup, leaking several allocated data structures.

Fix this by exiting via our common cleanup logic instead.

Reported-by: Jeff King <peff@peff.net> via Coverity
Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 refs/reftable-backend.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/refs/reftable-backend.c b/refs/reftable-backend.c
index 85214baa60..a14f2ad7f4 100644
--- a/refs/reftable-backend.c
+++ b/refs/reftable-backend.c
@@ -1503,7 +1503,7 @@ static int write_copy_table(struct reftable_writer *writer, void *cb_data)
 	 */
 	ret = reftable_merged_table_seek_log(mt, &it, arg->oldname);
 	if (ret < 0)
-		return ret;
+		goto done;
 
 	while (1) {
 		ret = reftable_iterator_next_log(&it, &old_log);
-- 
2.43.GIT


```

## Jeff King, 2024-02-15 05:32

Subject: Re: [PATCH] refs/reftable: fix leak when copying reflog fails
Message-ID: <20240215053205.GE2821179@coredump.intra.peff.net>
URL: https://gitlist.dev/e/20240215053205.GE2821179%40coredump.intra.peff.net
In-Reply-To: <02f7a97a451927f9a7ee06f3c5ea5af4c4eb6645.1707369907.git.ps@pks.im>

```
On Thu, Feb 08, 2024 at 06:26:14AM +0100, Patrick Steinhardt wrote:

> When copying a ref with the reftable backend we also copy the
> corresponding log records. When seeking the first log record that we're
> about to copy fails though we directly return from `write_copy_table()`
> without doing any cleanup, leaking several allocated data structures.
> 
> Fix this by exiting via our common cleanup logic instead.

Thanks, this looks obviously correct to me. :)

-Peff

```
