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

[PATCH v3 5/6] config.c: free(expanded) before die(), work around GCC oddity

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
Oct 22, 2021, 18:19 UTC
Message-ID
<patch-v3-5.6-9a44204c4c9-20211022T175227Z-avarab@gmail.com>
In-Reply-To
<cover-v3-0.6-00000000000-20211022T175227Z-avarab@gmail.com>

On my GCC version (10.2.1-6), but not the clang I have available t0017 will fail under SANITIZE=leak on optimization levels higher than -O0, which is annoying when combined with the change in 956d2e4639b (tests: add a test mode for SANITIZE=leak, run it in CI, 2021-09-23).

We really do have a memory leak here in either case, as e.g. running the pre-image under valgrind(1) will reveal. It's documented SANITIZE=leak (and "address", which exhibits the same behavior) might interact with compiler optimization in this way in some cases. Since this function is called recursively it's going to be especially interesting as an optimization target.

Let's work around this issue by freeing the "expanded" memory before we call die(), using a combination of the "goto cleanup" pattern introduced in a preceding commit, and the newly introduced die_message() function.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
---
 config.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/config.c b/config.c
index c5873f3a706..c36e85c2077 100644
--- a/config.c
+++ b/config.c
@@ -132,6 +132,7 @@ static int handle_path_include(const char *path, struct config_include_data *inc
 	int ret = 0;
 	struct strbuf buf = STRBUF_INIT;
 	char *expanded;
+	int exit_with = 0;
 
 	if (!path)
 		return config_error_nonbool("include.path");
@@ -161,17 +162,21 @@ static int handle_path_include(const char *path, struct config_include_data *inc
 	}
 
 	if (!access_or_die(path, R_OK, 0)) {
-		if (++inc->depth > MAX_INCLUDE_DEPTH)
-			die(_(include_depth_advice), MAX_INCLUDE_DEPTH, path,
-			    !cf ? "<unknown>" :
-			    cf->name ? cf->name :
-			    "the command line");
+		if (++inc->depth > MAX_INCLUDE_DEPTH) {
+			exit_with = die_message(_(include_depth_advice),
+						MAX_INCLUDE_DEPTH, path,
+						!cf ? "<unknown>" : cf->name ?
+						cf->name : "the command line");
+			goto cleanup;
+		}
 		ret = git_config_from_file(git_config_include, path, inc);
 		inc->depth--;
 	}
 cleanup:
 	strbuf_release(&buf);
 	free(expanded);
+	if (exit_with)
+		exit(exit_with);
 	return ret;
 }
 
-- 
2.33.1.1494.g88b39a443e1
Previous: Junio C HamanoNext: Jeff King
Message 23 of 26 in “leak tests: free() before die for two API functions”
  1. leak tests: free() before die for two API functionsÆvar Arnfjörð Bjarmason, Oct 21, 2021
  2. Andrzej HuntOct 21, 2021
  3. Junio C HamanoOct 21, 2021
  4. Martin ÅgrenOct 21, 2021
  5. 0/3 refs.c + config.c: plug memory leaksÆvar Arnfjörð Bjarmason, Oct 21, 2021
  6. 2/3 config.c: don't leak memory in handle_path_include()Ævar Arnfjörð Bjarmason, Oct 21, 2021
  7. Junio C HamanoOct 21, 2021
  8. Ævar Arnfjörð BjarmasonOct 22, 2021
  9. Junio C HamanoOct 22, 2021
  10. Ævar Arnfjörð BjarmasonOct 22, 2021
  11. 1/3 refs.c: make "repo_default_branch_name" static, remove xstrfmt()Ævar Arnfjörð Bjarmason, Oct 21, 2021
  12. Junio C HamanoOct 21, 2021
  13. 3/3 config.c: free(expanded) before die(), work around GCC oddityÆvar Arnfjörð Bjarmason, Oct 21, 2021
  14. Junio C HamanoOct 21, 2021
  15. 0/6 usage.c: add die_message() & plug memory leaks in refs.c & config.cÆvar Arnfjörð Bjarmason, Oct 22, 2021
  16. 1/6 usage.c: add a die_message() routineÆvar Arnfjörð Bjarmason, Oct 22, 2021
  17. Junio C HamanoOct 24, 2021
  18. 2/6 usage.c API users: use die_message() where appropriateÆvar Arnfjörð Bjarmason, Oct 22, 2021
  19. 3/6 usage.c + gc: add and use a die_message_errno()Ævar Arnfjörð Bjarmason, Oct 22, 2021
  20. Junio C HamanoOct 24, 2021
  21. 4/6 config.c: don't leak memory in handle_path_include()Ævar Arnfjörð Bjarmason, Oct 22, 2021
  22. Junio C HamanoOct 24, 2021
  23. 5/6 config.c: free(expanded) before die(), work around GCC oddityÆvar Arnfjörð Bjarmason, Oct 22, 2021
  24. Jeff KingOct 26, 2021
  25. 6/6 refs: plug memory leak in repo_default_branch_name()Ævar Arnfjörð Bjarmason, Oct 22, 2021
  26. Jonathan TanOct 27, 2021

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.