reftable/iter: handle allocation failures when creating indexed table iter

Handle allocation failures in `new_indexed_table_ref_iter()`. While at it, rename the function to match our coding style. 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:56 UTC cc6a9af5d729c054b86455eaa9a5cf7aa3e92288
3 files changed +23 -6
reftable/iter.c
+16 -4
@@ -181,14 +181,20 @@ static int indexed_table_ref_iter_next(void *p, struct reftable_record *rec)
181 }
182 }
183
184 -int new_indexed_table_ref_iter(struct indexed_table_ref_iter **dest,
184 +int indexed_table_ref_iter_new(struct indexed_table_ref_iter **dest,
185 struct reftable_reader *r, uint8_t *oid,
186 int oid_len, uint64_t *offsets, int offset_len)
187 {
188 struct indexed_table_ref_iter empty = INDEXED_TABLE_REF_ITER_INIT;
189 - struct indexed_table_ref_iter *itr = reftable_calloc(1, sizeof(*itr));
189 + struct indexed_table_ref_iter *itr;
190 int err = 0;
191
192 + itr = reftable_calloc(1, sizeof(*itr));
193 + if (!itr) {
194 + err = REFTABLE_OUT_OF_MEMORY_ERROR;
195 + goto out;
196 + }
197 +
198 *itr = empty;
199 itr->r = r;
200 strbuf_add(&itr->oid, oid, oid_len);
@@ -197,10 +203,16 @@ int new_indexed_table_ref_iter(struct indexed_table_ref_iter **dest,
203 itr->offset_len = offset_len;
204
205 err = indexed_table_ref_iter_next_block(itr);
206 + if (err < 0)
207 + goto out;
208 +
209 + *dest = itr;
210 + err = 0;
211 +
212 +out:
213 if (err < 0) {
214 + *dest = NULL;
215 reftable_free(itr);
202 - } else {
203 - *dest = itr;
216 }
217 return err;
218 }
reftable/iter.h
+1 -1
@@ -82,7 +82,7 @@ void iterator_from_indexed_table_ref_iter(struct reftable_iterator *it,
82 struct indexed_table_ref_iter *itr);
83
84 /* Takes ownership of `offsets` */
85 -int new_indexed_table_ref_iter(struct indexed_table_ref_iter **dest,
85 +int indexed_table_ref_iter_new(struct indexed_table_ref_iter **dest,
86 struct reftable_reader *r, uint8_t *oid,
87 int oid_len, uint64_t *offsets, int offset_len);
88
reftable/reader.c
+6 -1
@@ -715,7 +715,7 @@ static int reftable_reader_refs_for_indexed(struct reftable_reader *r,
715 goto done;
716 }
717
718 - err = new_indexed_table_ref_iter(&itr, r, oid, hash_size(r->hash_id),
718 + err = indexed_table_ref_iter_new(&itr, r, oid, hash_size(r->hash_id),
719 got.u.obj.offsets,
720 got.u.obj.offset_len);
721 if (err < 0)
@@ -740,6 +740,11 @@ static int reftable_reader_refs_for_unindexed(struct reftable_reader *r,
740 int err;
741
742 REFTABLE_ALLOC_ARRAY(ti, 1);
743 + if (!ti) {
744 + err = REFTABLE_OUT_OF_MEMORY_ERROR;
745 + goto out;
746 + }
747 +
748 table_iter_init(ti, r);
749 err = table_iter_seek_start(ti, BLOCK_TYPE_REF, 0);
750 if (err < 0)