]> git.ipfire.org Git - thirdparty/git.git/commitdiff
reftable/reader: handle allocation failures in `reader_init_iter()`
authorPatrick Steinhardt <ps@pks.im>
Wed, 2 Oct 2024 10:55:59 +0000 (12:55 +0200)
committerJunio C Hamano <gitster@pobox.com>
Wed, 2 Oct 2024 14:53:53 +0000 (07:53 -0700)
Handle allocation failures in `reader_init_iter()`. This requires us to
also adapt `reftable_reader_init_*_iterator()` to bubble up the new
error codes. Adapt callers accordingly.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
reftable/merged.c
reftable/reader.c
reftable/reader.h
reftable/reftable-reader.h
t/unit-tests/t-reftable-readwrite.c

index de4f81abaf5184e73297762623ade7f784306106..69790c345cd10bb56a5a191d24f24c8d1b45dbad 100644 (file)
@@ -244,7 +244,9 @@ int merged_table_init_iter(struct reftable_merged_table *mt,
 
        for (size_t i = 0; i < mt->readers_len; i++) {
                reftable_record_init(&subiters[i].rec, typ);
-               reader_init_iter(mt->readers[i], &subiters[i].iter, typ);
+               ret = reader_init_iter(mt->readers[i], &subiters[i].iter, typ);
+               if (ret < 0)
+                       goto out;
        }
 
        REFTABLE_CALLOC_ARRAY(mi, 1);
index 485ee085dac8645cc27977ff717c9d221573fc68..f696e992dfc901560502f3ae11b5dff7fb631446 100644 (file)
@@ -554,32 +554,37 @@ static void iterator_from_table_iter(struct reftable_iterator *it,
        it->ops = &table_iter_vtable;
 }
 
-void reader_init_iter(struct reftable_reader *r,
-                     struct reftable_iterator *it,
-                     uint8_t typ)
+int reader_init_iter(struct reftable_reader *r,
+                    struct reftable_iterator *it,
+                    uint8_t typ)
 {
        struct reftable_reader_offsets *offs = reader_offsets_for(r, typ);
 
        if (offs->is_present) {
                struct table_iter *ti;
                REFTABLE_ALLOC_ARRAY(ti, 1);
+               if (!ti)
+                       return REFTABLE_OUT_OF_MEMORY_ERROR;
+
                table_iter_init(ti, r);
                iterator_from_table_iter(it, ti);
        } else {
                iterator_set_empty(it);
        }
+
+       return 0;
 }
 
-void reftable_reader_init_ref_iterator(struct reftable_reader *r,
-                                      struct reftable_iterator *it)
+int reftable_reader_init_ref_iterator(struct reftable_reader *r,
+                                     struct reftable_iterator *it)
 {
-       reader_init_iter(r, it, BLOCK_TYPE_REF);
+       return reader_init_iter(r, it, BLOCK_TYPE_REF);
 }
 
-void reftable_reader_init_log_iterator(struct reftable_reader *r,
-                                      struct reftable_iterator *it)
+int reftable_reader_init_log_iterator(struct reftable_reader *r,
+                                     struct reftable_iterator *it)
 {
-       reader_init_iter(r, it, BLOCK_TYPE_LOG);
+       return reader_init_iter(r, it, BLOCK_TYPE_LOG);
 }
 
 int reftable_reader_new(struct reftable_reader **out,
@@ -689,7 +694,10 @@ static int reftable_reader_refs_for_indexed(struct reftable_reader *r,
        struct indexed_table_ref_iter *itr = NULL;
 
        /* Look through the reverse index. */
-       reader_init_iter(r, &oit, BLOCK_TYPE_OBJ);
+       err = reader_init_iter(r, &oit, BLOCK_TYPE_OBJ);
+       if (err < 0)
+               goto done;
+
        err = iterator_seek(&oit, &want);
        if (err != 0)
                goto done;
index 3710ee09b4ca328a8ab990667b8ced8a98f6163f..02d10c5d37e9a454c63d3c06ead3ef217696560f 100644 (file)
@@ -56,9 +56,9 @@ struct reftable_reader {
 
 const char *reader_name(struct reftable_reader *r);
 
-void reader_init_iter(struct reftable_reader *r,
-                     struct reftable_iterator *it,
-                     uint8_t typ);
+int reader_init_iter(struct reftable_reader *r,
+                    struct reftable_iterator *it,
+                    uint8_t typ);
 
 /* initialize a block reader to read from `r` */
 int reader_init_block_reader(struct reftable_reader *r, struct block_reader *br,
index a600452b565803c25f502396910910cf97b9d8a0..6a2d0b693f5e4a43502a7cb4a6740072f0bf471b 100644 (file)
@@ -46,12 +46,12 @@ void reftable_reader_incref(struct reftable_reader *reader);
 void reftable_reader_decref(struct reftable_reader *reader);
 
 /* Initialize a reftable iterator for reading refs. */
-void reftable_reader_init_ref_iterator(struct reftable_reader *r,
-                                      struct reftable_iterator *it);
+int reftable_reader_init_ref_iterator(struct reftable_reader *r,
+                                     struct reftable_iterator *it);
 
 /* Initialize a reftable iterator for reading logs. */
-void reftable_reader_init_log_iterator(struct reftable_reader *r,
-                                      struct reftable_iterator *it);
+int reftable_reader_init_log_iterator(struct reftable_reader *r,
+                                     struct reftable_iterator *it);
 
 /* returns the hash ID used in this table. */
 uint32_t reftable_reader_hash_id(struct reftable_reader *r);
index e1b235a5f13471ca59eee0400190c68420f79476..acca927a2cf311bf210b366fbbc5143f9a1a4c26 100644 (file)
@@ -206,7 +206,8 @@ static void t_log_write_read(void)
        err = reftable_reader_new(&reader, &source, "file.log");
        check(!err);
 
-       reftable_reader_init_ref_iterator(reader, &it);
+       err = reftable_reader_init_ref_iterator(reader, &it);
+       check(!err);
 
        err = reftable_iterator_seek_ref(&it, names[N - 1]);
        check(!err);
@@ -221,8 +222,8 @@ static void t_log_write_read(void)
        reftable_iterator_destroy(&it);
        reftable_ref_record_release(&ref);
 
-       reftable_reader_init_log_iterator(reader, &it);
-
+       err = reftable_reader_init_log_iterator(reader, &it);
+       check(!err);
        err = reftable_iterator_seek_log(&it, "");
        check(!err);
 
@@ -296,7 +297,8 @@ static void t_log_zlib_corruption(void)
        err = reftable_reader_new(&reader, &source, "file.log");
        check(!err);
 
-       reftable_reader_init_log_iterator(reader, &it);
+       err = reftable_reader_init_log_iterator(reader, &it);
+       check(!err);
        err = reftable_iterator_seek_log(&it, "refname");
        check_int(err, ==, REFTABLE_ZLIB_ERROR);
 
@@ -325,7 +327,8 @@ static void t_table_read_write_sequential(void)
        err = reftable_reader_new(&reader, &source, "file.ref");
        check(!err);
 
-       reftable_reader_init_ref_iterator(reader, &it);
+       err = reftable_reader_init_ref_iterator(reader, &it);
+       check(!err);
        err = reftable_iterator_seek_ref(&it, "");
        check(!err);
 
@@ -376,7 +379,8 @@ static void t_table_read_api(void)
        err = reftable_reader_new(&reader, &source, "file.ref");
        check(!err);
 
-       reftable_reader_init_ref_iterator(reader, &it);
+       err = reftable_reader_init_ref_iterator(reader, &it);
+       check(!err);
        err = reftable_iterator_seek_ref(&it, names[0]);
        check(!err);
 
@@ -419,7 +423,8 @@ static void t_table_read_write_seek(int index, int hash_id)
        }
 
        for (i = 1; i < N; i++) {
-               reftable_reader_init_ref_iterator(reader, &it);
+               err = reftable_reader_init_ref_iterator(reader, &it);
+               check(!err);
                err = reftable_iterator_seek_ref(&it, names[i]);
                check(!err);
                err = reftable_iterator_next_ref(&it, &ref);
@@ -435,7 +440,8 @@ static void t_table_read_write_seek(int index, int hash_id)
        strbuf_addstr(&pastLast, names[N - 1]);
        strbuf_addstr(&pastLast, "/");
 
-       reftable_reader_init_ref_iterator(reader, &it);
+       err = reftable_reader_init_ref_iterator(reader, &it);
+       check(!err);
        err = reftable_iterator_seek_ref(&it, pastLast.buf);
        if (err == 0) {
                struct reftable_ref_record ref = { 0 };
@@ -534,7 +540,8 @@ static void t_table_refs_for(int indexed)
        if (!indexed)
                reader->obj_offsets.is_present = 0;
 
-       reftable_reader_init_ref_iterator(reader, &it);
+       err = reftable_reader_init_ref_iterator(reader, &it);
+       check(!err);
        err = reftable_iterator_seek_ref(&it, "");
        check(!err);
        reftable_iterator_destroy(&it);
@@ -593,7 +600,8 @@ static void t_write_empty_table(void)
        err = reftable_reader_new(&rd, &source, "filename");
        check(!err);
 
-       reftable_reader_init_ref_iterator(rd, &it);
+       err = reftable_reader_init_ref_iterator(rd, &it);
+       check(!err);
        err = reftable_iterator_seek_ref(&it, "");
        check(!err);
 
@@ -802,7 +810,8 @@ static void t_write_multiple_indices(void)
         * Seeking the log uses the log index now. In case there is any
         * confusion regarding indices we would notice here.
         */
-       reftable_reader_init_log_iterator(reader, &it);
+       err = reftable_reader_init_log_iterator(reader, &it);
+       check(!err);
        err = reftable_iterator_seek_log(&it, "");
        check(!err);
 
@@ -858,7 +867,8 @@ static void t_write_multi_level_index(void)
        /*
         * Seeking the last ref should work as expected.
         */
-       reftable_reader_init_ref_iterator(reader, &it);
+       err = reftable_reader_init_ref_iterator(reader, &it);
+       check(!err);
        err = reftable_iterator_seek_ref(&it, "refs/heads/199");
        check(!err);