]> git.ipfire.org Git - thirdparty/git.git/commitdiff
reftable/merged: fix zero-sized allocation when there are no readers
authorPatrick Steinhardt <ps@pks.im>
Sun, 22 Dec 2024 07:24:29 +0000 (08:24 +0100)
committerJunio C Hamano <gitster@pobox.com>
Sun, 22 Dec 2024 08:58:23 +0000 (00:58 -0800)
It was reported [1] that Git started to fail with an out-of-memory error
when initializing repositories with the reftable backend on NonStop
platforms. A bisect led to 802c0646ac (reftable/merged: handle
allocation failures in `merged_table_init_iter()`, 2024-10-02), which
changed how we allocate memory when initializing a merged table.

The root cause of this seems to be that NonStop returns a `NULL` pointer
when doing a zero-sized allocation. This would've already happened
before the above change, but we never noticed because we did not check
the result. Now we do notice and thus return an out-of-memory error to
the caller.

Fix the issue by skipping the allocation altogether in case there are no
readers.

[1]: <00ad01db5017$aa9ce340$ffd6a9c0$@nexbridge.com>

Reported-by: Randall S. Becker <rsbecker@nexbridge.com>
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
reftable/merged.c

index 514d6facf45403d6276cc51a0e836b22b556e338..5ff4bc35c29a4f23db62533486c8cd2fca2f4728 100644 (file)
@@ -238,14 +238,16 @@ int merged_table_init_iter(struct reftable_merged_table *mt,
                           struct reftable_iterator *it,
                           uint8_t typ)
 {
-       struct merged_subiter *subiters;
+       struct merged_subiter *subiters = NULL;
        struct merged_iter *mi = NULL;
        int ret;
 
-       REFTABLE_CALLOC_ARRAY(subiters, mt->readers_len);
-       if (!subiters) {
-               ret = REFTABLE_OUT_OF_MEMORY_ERROR;
-               goto out;
+       if (mt->readers_len) {
+               REFTABLE_CALLOC_ARRAY(subiters, mt->readers_len);
+               if (!subiters) {
+                       ret = REFTABLE_OUT_OF_MEMORY_ERROR;
+                       goto out;
+               }
        }
 
        for (size_t i = 0; i < mt->readers_len; i++) {