git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 2/4] reftable/merged: fix zero-sized allocation when there are no readers

From
Patrick Steinhardt <ps@pks.im>
Date
Dec 21, 2024, 11:50 UTC
Message-ID
<20241221-b4-pks-reftable-oom-fix-without-readers-v1-2-12db83a3267c@pks.im>
In-Reply-To
<20241221-b4-pks-reftable-oom-fix-without-readers-v1-0-12db83a3267c@pks.im>

It was reported [1c 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 that we do we 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>
---
 reftable/merged.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/reftable/merged.c b/reftable/merged.c
index bb0836e3443271f9c0d5ba5582c78694d437ddc2..e72b39e178d4dec6ddfca970b5af71b71431397a 100644
--- a/reftable/merged.c
+++ b/reftable/merged.c
@@ -240,14 +240,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++) {
-- 
2.48.0.rc0.184.g0fc57dec57.dirty
Previous: Patrick SteinhardtNext: Kristoffer Haugsbakk
Message 6 of 30 in “reftable: fix out-of-memory errors on NonStop”
  1. 0/4 reftable: fix out-of-memory errors on NonStopPatrick Steinhardt, Dec 21, 2024
  2. 1/4 reftable/stack: don't perform auto-compaction with less than two tablesPatrick Steinhardt, Dec 21, 2024
  3. Junio C HamanoDec 21, 2024
  4. Junio C HamanoDec 21, 2024
  5. Patrick SteinhardtDec 22, 2024
  6. 2/4 reftable/merged: fix zero-sized allocation when there are no readersPatrick Steinhardt, Dec 21, 2024
  7. Kristoffer HaugsbakkDec 21, 2024
  8. Patrick SteinhardtDec 21, 2024
  9. Junio C HamanoDec 21, 2024
  10. 3/4 reftable/stack: fix zero-sized allocation when there are no readersPatrick Steinhardt, Dec 21, 2024
  11. Junio C HamanoDec 21, 2024
  12. Junio C HamanoDec 21, 2024
  13. rsbecker@nexbridge.comDec 21, 2024
  14. Junio C HamanoDec 21, 2024
  15. rsbecker@nexbridge.comDec 22, 2024
  16. rsbecker@nexbridge.comDec 22, 2024
  17. Patrick SteinhardtDec 22, 2024
  18. Junio C HamanoDec 23, 2024
  19. Patrick SteinhardtDec 22, 2024
  20. 4/4 reftable/basics: return NULL on zero-sized allocationsPatrick Steinhardt, Dec 21, 2024
  21. Kristoffer HaugsbakkDec 21, 2024
  22. Randall BeckerDec 21, 2024
  23. Junio C HamanoDec 21, 2024
  24. Junio C HamanoDec 21, 2024
  25. 0/4 reftable: fix out-of-memory errors on NonStopPatrick Steinhardt, Dec 22, 2024
  26. 1/4 reftable/stack: don't perform auto-compaction with less than two tablesPatrick Steinhardt, Dec 22, 2024
  27. 2/4 reftable/merged: fix zero-sized allocation when there are no readersPatrick Steinhardt, Dec 22, 2024
  28. 3/4 reftable/stack: fix zero-sized allocation when there are no readersPatrick Steinhardt, Dec 22, 2024
  29. 4/4 reftable/basics: return NULL on zero-sized allocationsPatrick Steinhardt, Dec 22, 2024
  30. Junio C HamanoDec 22, 2024

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.