aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2024-04-06 11:11:12 -0700
committerJunio C Hamano <gitster@pobox.com>2024-04-08 13:20:24 -0700
commit0e0fefb29fde59b6703d3b45987823fe85c00706 (patch)
treef3fef5ae0badb949dc1603487ea5bbc566bf1479
parent0d1bd1dfb37ef25e1911777c94129fc769ffec38 (diff)
downloadgit-0e0fefb29fde59b6703d3b45987823fe85c00706.tar.gz
config: do not leak excludes_file
The excludes_file variable is marked "const char *", but all the assignments to it are made with a piece of memory allocated just for it, and the variable is responsible for owning it. When "core.excludesfile" is read, the code just lost the previous value, leaking memory. Plug it. The real problem is that the variable is mistyped; our convention is to never make a variable that owns the piece of memory pointed by it as "const". Fixing that would reduce the chance of this kind of bug happening, and also would make it unnecessary to cast the constness away while free()ing it, but that would be a much larger follow-up effort. Reported-by: Rubén Justo <rjusto@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--config.c4
-rwxr-xr-xt/t7300-clean.sh1
2 files changed, 4 insertions, 1 deletions
diff --git a/config.c b/config.c
index aa2888d301..146856567a 100644
--- a/config.c
+++ b/config.c
@@ -1690,8 +1690,10 @@ static int git_default_core_config(const char *var, const char *value, void *cb)
if (!strcmp(var, "core.askpass"))
return git_config_string(&askpass_program, var, value);
- if (!strcmp(var, "core.excludesfile"))
+ if (!strcmp(var, "core.excludesfile")) {
+ free((char *)excludes_file);
return git_config_pathname(&excludes_file, var, value);
+ }
if (!strcmp(var, "core.whitespace")) {
if (!value)
diff --git a/t/t7300-clean.sh b/t/t7300-clean.sh
index c975eb54d2..529fc53339 100755
--- a/t/t7300-clean.sh
+++ b/t/t7300-clean.sh
@@ -5,6 +5,7 @@
test_description='git clean basic tests'
+TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh
git config clean.requireForce no