From: Patrick Steinhardt Date: Sun, 22 Dec 2024 07:24:29 +0000 (+0100) Subject: reftable/merged: fix zero-sized allocation when there are no readers X-Git-Tag: v2.48.0-rc1~23^2~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5ab83521cfe687e4295f5748f2c5d2aa7477efe5;p=thirdparty%2Fgit.git reftable/merged: fix zero-sized allocation when there are no readers 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 Signed-off-by: Patrick Steinhardt Signed-off-by: Junio C Hamano --- diff --git a/reftable/merged.c b/reftable/merged.c index 514d6facf4..5ff4bc35c2 100644 --- a/reftable/merged.c +++ b/reftable/merged.c @@ -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++) {