]> git.ipfire.org Git - thirdparty/git.git/commitdiff
reftable/stack: fix zero-sized allocation when there are no readers
authorPatrick Steinhardt <ps@pks.im>
Sun, 22 Dec 2024 07:24:30 +0000 (08:24 +0100)
committerJunio C Hamano <gitster@pobox.com>
Sun, 22 Dec 2024 08:58:23 +0000 (00:58 -0800)
Similar as the preceding commit, we may try to do a zero-sized
allocation when reloading a reftable stack that ain't got any tables.
It is implementation-defined whether malloc(3p) returns a NULL pointer
in that case or a zero-sized object. In case it does return a NULL
pointer though it causes us to think we have run into an out-of-memory
situation, and thus we return an error.

Fix this by only allocating arrays when they have at least one entry.

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/stack.c

index ae274cd51c86417f17a35fedff16210bcf864c3e..f51d3ec9d98235ad58aa78b415940b387abe0d27 100644 (file)
@@ -254,9 +254,9 @@ static int reftable_stack_reload_once(struct reftable_stack *st,
                                      int reuse_open)
 {
        size_t cur_len = !st->merged ? 0 : st->merged->readers_len;
-       struct reftable_reader **cur;
+       struct reftable_reader **cur = NULL;
        struct reftable_reader **reused = NULL;
-       struct reftable_reader **new_readers;
+       struct reftable_reader **new_readers = NULL;
        size_t reused_len = 0, reused_alloc = 0, names_len;
        size_t new_readers_len = 0;
        struct reftable_merged_table *new_merged = NULL;
@@ -264,18 +264,22 @@ static int reftable_stack_reload_once(struct reftable_stack *st,
        int err = 0;
        size_t i;
 
-       cur = stack_copy_readers(st, cur_len);
-       if (!cur) {
-               err = REFTABLE_OUT_OF_MEMORY_ERROR;
-               goto done;
+       if (cur_len) {
+               cur = stack_copy_readers(st, cur_len);
+               if (!cur) {
+                       err = REFTABLE_OUT_OF_MEMORY_ERROR;
+                       goto done;
+               }
        }
 
        names_len = names_length(names);
 
-       new_readers = reftable_calloc(names_len, sizeof(*new_readers));
-       if (!new_readers) {
-               err = REFTABLE_OUT_OF_MEMORY_ERROR;
-               goto done;
+       if (names_len) {
+               new_readers = reftable_calloc(names_len, sizeof(*new_readers));
+               if (!new_readers) {
+                       err = REFTABLE_OUT_OF_MEMORY_ERROR;
+                       goto done;
+               }
        }
 
        while (*names) {