Skip to content

Commit 60dd319

Browse files
pks-tgitster
authored andcommitted
reftable/writer: unify releasing memory
There are two code paths which release memory of the reftable writer: - `reftable_writer_close()` releases internal state after it has written data. - `reftable_writer_free()` releases the block that was written to and the writer itself. Both code paths free different parts of the writer, and consequently the caller must make sure to call both. And while callers mostly do this already, this falls apart when a write failure causes the caller to skip calling `reftable_write_close()`. Introduce a new function `reftable_writer_release()` that releases all internal state and call it from both paths. Like this it is fine for the caller to not call `reftable_writer_close()`. Signed-off-by: Patrick Steinhardt <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 7e892fe commit 60dd319

File tree

1 file changed

+15
-8
lines changed

1 file changed

+15
-8
lines changed

reftable/writer.c

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -149,11 +149,21 @@ void reftable_writer_set_limits(struct reftable_writer *w, uint64_t min,
149149
w->max_update_index = max;
150150
}
151151

152+
static void writer_release(struct reftable_writer *w)
153+
{
154+
if (w) {
155+
reftable_free(w->block);
156+
w->block = NULL;
157+
block_writer_release(&w->block_writer_data);
158+
w->block_writer = NULL;
159+
writer_clear_index(w);
160+
strbuf_release(&w->last_key);
161+
}
162+
}
163+
152164
void reftable_writer_free(struct reftable_writer *w)
153165
{
154-
if (!w)
155-
return;
156-
reftable_free(w->block);
166+
writer_release(w);
157167
reftable_free(w);
158168
}
159169

@@ -643,16 +653,13 @@ int reftable_writer_close(struct reftable_writer *w)
643653
}
644654

645655
done:
646-
/* free up memory. */
647-
block_writer_release(&w->block_writer_data);
648-
writer_clear_index(w);
649-
strbuf_release(&w->last_key);
656+
writer_release(w);
650657
return err;
651658
}
652659

653660
static void writer_clear_index(struct reftable_writer *w)
654661
{
655-
for (size_t i = 0; i < w->index_len; i++)
662+
for (size_t i = 0; w->index && i < w->index_len; i++)
656663
strbuf_release(&w->index[i].last_key);
657664
FREE_AND_NULL(w->index);
658665
w->index_len = 0;

0 commit comments

Comments
 (0)