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

[PATCH 3/4] setup: refactor `upgrade_repository_format()` to have common exit

From
Patrick Steinhardt <ps@pks.im>
Date
Nov 6, 2023, 10:46 UTC
Message-ID
<44e133dc8d8e2b2e2172edff0847968bed9c3f27.1699267422.git.ps@pks.im>
In-Reply-To
<cover.1699267422.git.ps@pks.im>

The `upgrade_repository_format()` function has multiple exit paths, which means that there is no common cleanup of acquired resources. While this isn't much of a problem right now, we're about to fix a memory leak that would require us to free the resource in every one of those exit paths.

Refactor the code to have a common exit path so that the subsequent memory leak fix becomes easier to implement.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 setup.c | 31 ++++++++++++++++++++-----------
 1 file changed, 20 insertions(+), 11 deletions(-)
diff --git a/setup.c b/setup.c
index 2e607632dbd..b9474b163a0 100644
--- a/setup.c
+++ b/setup.c
@@ -693,29 +693,38 @@ int upgrade_repository_format(int target_version)
 	struct strbuf err = STRBUF_INIT;
 	struct strbuf repo_version = STRBUF_INIT;
 	struct repository_format repo_fmt = REPOSITORY_FORMAT_INIT;
+	int ret;
 
 	strbuf_git_common_path(&sb, the_repository, "config");
 	read_repository_format(&repo_fmt, sb.buf);
 	strbuf_release(&sb);
 
-	if (repo_fmt.version >= target_version)
-		return 0;
+	if (repo_fmt.version >= target_version) {
+		ret = 0;
+		goto out;
+	}
 
 	if (verify_repository_format(&repo_fmt, &err) < 0) {
-		error("cannot upgrade repository format from %d to %d: %s",
-		      repo_fmt.version, target_version, err.buf);
-		strbuf_release(&err);
-		return -1;
+		ret = error("cannot upgrade repository format from %d to %d: %s",
+			    repo_fmt.version, target_version, err.buf);
+		goto out;
+	}
+	if (!repo_fmt.version && repo_fmt.unknown_extensions.nr) {
+		ret = error("cannot upgrade repository format: "
+			    "unknown extension %s",
+			    repo_fmt.unknown_extensions.items[0].string);
+		goto out;
 	}
-	if (!repo_fmt.version && repo_fmt.unknown_extensions.nr)
-		return error("cannot upgrade repository format: "
-			     "unknown extension %s",
-			     repo_fmt.unknown_extensions.items[0].string);
 
 	strbuf_addf(&repo_version, "%d", target_version);
 	git_config_set("core.repositoryformatversion", repo_version.buf);
+
+	ret = 1;
+
+out:
 	strbuf_release(&repo_version);
-	return 1;
+	strbuf_release(&err);
+	return ret;
 }
 
 static void init_repository_format(struct repository_format *format)
-- 
2.42.0
Previous: Jeff KingNext: Patrick Steinhardt
Message 6 of 9 in “Memory leak fixes”
  1. 0/4 Memory leak fixesPatrick Steinhardt, Nov 6, 2023
  2. 1/4 test-bloom: stop setting up Git directory twicePatrick Steinhardt, Nov 6, 2023
  3. Jeff KingNov 6, 2023
  4. 2/4 shallow: fix memory leak when registering shallow rootsPatrick Steinhardt, Nov 6, 2023
  5. Jeff KingNov 6, 2023
  6. 3/4 setup: refactor `upgrade_repository_format()` to have common exitPatrick Steinhardt, Nov 6, 2023
  7. 4/4 setup: fix leaking repository formatPatrick Steinhardt, Nov 6, 2023
  8. Jeff KingNov 6, 2023
  9. Junio C HamanoNov 7, 2023

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.