reftable/reader: handle allocation failures for unindexed reader

Handle allocation failures when creating unindexed readers. 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 18da60029319733e2d931f2758a8e47b8b25b117
1 file changed +17 -6
reftable/reader.c
+17 -6
@@ -734,19 +734,30 @@ static int reftable_reader_refs_for_unindexed(struct reftable_reader *r,
734 REFTABLE_ALLOC_ARRAY(ti, 1);
735 table_iter_init(ti, r);
736 err = table_iter_seek_start(ti, BLOCK_TYPE_REF, 0);
737 - if (err < 0) {
738 - reftable_free(ti);
739 - return err;
740 - }
737 + if (err < 0)
738 + goto out;
739
742 - filter = reftable_malloc(sizeof(struct filtering_ref_iterator));
740 + filter = reftable_malloc(sizeof(*filter));
741 + if (!filter) {
742 + err = REFTABLE_OUT_OF_MEMORY_ERROR;
743 + goto out;
744 + }
745 *filter = empty;
746
747 strbuf_add(&filter->oid, oid, oid_len);
748 iterator_from_table_iter(&filter->it, ti);
749
750 iterator_from_filtering_ref_iterator(it, filter);
749 - return 0;
751 +
752 + err = 0;
753 +
754 +out:
755 + if (err < 0) {
756 + if (ti)
757 + table_iter_close(ti);
758 + reftable_free(ti);
759 + }
760 + return err;
761 }
762
763 int reftable_reader_refs_for(struct reftable_reader *r,