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 <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Patrick Steinhardt committed
Oct 2, 2024 at 12:55 UTC
74d1c18757d1a45b95e46836adf478193a34c42c
4 files changed
+38
-18
reftable/reftable-writer.h
+7
-5
@@ -90,11 +90,13 @@ struct reftable_stats {
90
int object_id_len;
91
};
92
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);
100
101
/* Set the range of update indices for the records we will add. When writing a
102
table into a stack, the min should be at least
reftable/stack.c
+10
-4
@@ -808,8 +808,11 @@ int reftable_addition_add(struct reftable_addition *add,
808
}
809
tab_fd = get_tempfile_fd(tab_file);
810
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
+
816
err = write_table(wr, arg);
817
if (err < 0)
818
goto done;
@@ -898,8 +901,11 @@ static int stack_compact_locked(struct reftable_stack *st,
901
goto done;
902
}
903
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
+
909
err = stack_write_compact(st, wr, first, last, config);
910
if (err < 0)
911
goto done;
reftable/writer.c
+16
-6
@@ -117,13 +117,17 @@ static void writer_reinit_block_writer(struct reftable_writer *w, uint8_t typ)
117
w->block_writer->restart_interval = w->opts.restart_interval;
118
}
119
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)
124
{
125
- struct reftable_writer *wp = reftable_calloc(1, sizeof(*wp));
125
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;
131
132
if (_opts)
133
opts = *_opts;
@@ -134,13 +138,19 @@ reftable_new_writer(ssize_t (*writer_func)(void *, const void *, size_t),
138
strbuf_init(&wp->block_writer_data.last_key, 0);
139
strbuf_init(&wp->last_key, 0);
140
REFTABLE_CALLOC_ARRAY(wp->block, opts.block_size);
141
+ if (!wp->block) {
142
+ reftable_free(wp);
143
+ return REFTABLE_OUT_OF_MEMORY_ERROR;
144
+ }
145
wp->write = writer_func;
146
wp->write_arg = writer_arg;
147
wp->opts = opts;
148
wp->flush = flush_func;
149
writer_reinit_block_writer(wp, BLOCK_TYPE_REF);
150
143
- return wp;
151
+ *out = wp;
152
+
153
+ return 0;
154
}
155
156
void reftable_writer_set_limits(struct reftable_writer *w, uint64_t min,
t/unit-tests/lib-reftable.c
+5
-3
@@ -22,9 +22,11 @@ static int strbuf_writer_flush(void *arg UNUSED)
22
struct reftable_writer *t_reftable_strbuf_writer(struct strbuf *buf,
23
struct reftable_write_options *opts)
24
{
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;
30
}
31
32
void t_reftable_write_to_buf(struct strbuf *buf,