Skip to content

Commit 74d1c18

Browse files
pks-tgitster
authored andcommitted
reftable/writer: handle allocation failures in reftable_new_writer()
Handle allocation failures in `reftable_new_writer()`. Adapt the function to return an error code to return such failures. While at it, rename it to match our code style as we have to touch up every callsite anyway. Signed-off-by: Patrick Steinhardt <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent b680af2 commit 74d1c18

File tree

4 files changed

+38
-18
lines changed

4 files changed

+38
-18
lines changed

reftable/reftable-writer.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,13 @@ struct reftable_stats {
9090
int object_id_len;
9191
};
9292

93-
/* reftable_new_writer creates a new writer */
94-
struct reftable_writer *
95-
reftable_new_writer(ssize_t (*writer_func)(void *, const void *, size_t),
96-
int (*flush_func)(void *),
97-
void *writer_arg, const struct reftable_write_options *opts);
93+
struct reftable_writer;
94+
95+
/* Create a new writer. */
96+
int reftable_writer_new(struct reftable_writer **out,
97+
ssize_t (*writer_func)(void *, const void *, size_t),
98+
int (*flush_func)(void *),
99+
void *writer_arg, const struct reftable_write_options *opts);
98100

99101
/* Set the range of update indices for the records we will add. When writing a
100102
table into a stack, the min should be at least

reftable/stack.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -808,8 +808,11 @@ int reftable_addition_add(struct reftable_addition *add,
808808
}
809809
tab_fd = get_tempfile_fd(tab_file);
810810

811-
wr = reftable_new_writer(reftable_fd_write, reftable_fd_flush, &tab_fd,
812-
&add->stack->opts);
811+
err = reftable_writer_new(&wr, reftable_fd_write, reftable_fd_flush,
812+
&tab_fd, &add->stack->opts);
813+
if (err < 0)
814+
goto done;
815+
813816
err = write_table(wr, arg);
814817
if (err < 0)
815818
goto done;
@@ -898,8 +901,11 @@ static int stack_compact_locked(struct reftable_stack *st,
898901
goto done;
899902
}
900903

901-
wr = reftable_new_writer(reftable_fd_write, reftable_fd_flush,
902-
&tab_fd, &st->opts);
904+
err = reftable_writer_new(&wr, reftable_fd_write, reftable_fd_flush,
905+
&tab_fd, &st->opts);
906+
if (err < 0)
907+
goto done;
908+
903909
err = stack_write_compact(st, wr, first, last, config);
904910
if (err < 0)
905911
goto done;

reftable/writer.c

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -117,13 +117,17 @@ static void writer_reinit_block_writer(struct reftable_writer *w, uint8_t typ)
117117
w->block_writer->restart_interval = w->opts.restart_interval;
118118
}
119119

120-
struct reftable_writer *
121-
reftable_new_writer(ssize_t (*writer_func)(void *, const void *, size_t),
122-
int (*flush_func)(void *),
123-
void *writer_arg, const struct reftable_write_options *_opts)
120+
int reftable_writer_new(struct reftable_writer **out,
121+
ssize_t (*writer_func)(void *, const void *, size_t),
122+
int (*flush_func)(void *),
123+
void *writer_arg, const struct reftable_write_options *_opts)
124124
{
125-
struct reftable_writer *wp = reftable_calloc(1, sizeof(*wp));
126125
struct reftable_write_options opts = {0};
126+
struct reftable_writer *wp;
127+
128+
wp = reftable_calloc(1, sizeof(*wp));
129+
if (!wp)
130+
return REFTABLE_OUT_OF_MEMORY_ERROR;
127131

128132
if (_opts)
129133
opts = *_opts;
@@ -134,13 +138,19 @@ reftable_new_writer(ssize_t (*writer_func)(void *, const void *, size_t),
134138
strbuf_init(&wp->block_writer_data.last_key, 0);
135139
strbuf_init(&wp->last_key, 0);
136140
REFTABLE_CALLOC_ARRAY(wp->block, opts.block_size);
141+
if (!wp->block) {
142+
reftable_free(wp);
143+
return REFTABLE_OUT_OF_MEMORY_ERROR;
144+
}
137145
wp->write = writer_func;
138146
wp->write_arg = writer_arg;
139147
wp->opts = opts;
140148
wp->flush = flush_func;
141149
writer_reinit_block_writer(wp, BLOCK_TYPE_REF);
142150

143-
return wp;
151+
*out = wp;
152+
153+
return 0;
144154
}
145155

146156
void reftable_writer_set_limits(struct reftable_writer *w, uint64_t min,

t/unit-tests/lib-reftable.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@ static int strbuf_writer_flush(void *arg UNUSED)
2222
struct reftable_writer *t_reftable_strbuf_writer(struct strbuf *buf,
2323
struct reftable_write_options *opts)
2424
{
25-
return reftable_new_writer(&strbuf_writer_write,
26-
&strbuf_writer_flush,
27-
buf, opts);
25+
struct reftable_writer *writer;
26+
int ret = reftable_writer_new(&writer, &strbuf_writer_write, &strbuf_writer_flush,
27+
buf, opts);
28+
check(!ret);
29+
return writer;
2830
}
2931

3032
void t_reftable_write_to_buf(struct strbuf *buf,

0 commit comments

Comments
 (0)