summaryrefslogtreecommitdiffstats
path: root/diff.c
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2024-09-26 13:46:29 +0200
committerJunio C Hamano <gitster@pobox.com>2024-09-27 17:25:35 +0200
commit76c7e708bbd6b19856d1ffa58f720e8da0c9eb0f (patch)
treecb654faac69e30663cb56788ff0644b2feefdf40 /diff.c
parentbuiltin/pull: fix leaking "ff" option (diff)
downloadgit-76c7e708bbd6b19856d1ffa58f720e8da0c9eb0f.tar.xz
git-76c7e708bbd6b19856d1ffa58f720e8da0c9eb0f.zip
diff: fix leaking orderfile option
The `orderfile` diff option is being assigned via `OPT_FILENAME()`, which assigns an allocated string to the variable. We never free it though, causing a memory leak. Change the type of the string to `char *` and free it to plug the leak. This also requires us to use `xstrdup()` to assign the global config to it in case it is set. This leak is being hit in t7621, but plugging it alone does not make the test suite pass. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'diff.c')
-rw-r--r--diff.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/diff.c b/diff.c
index 472479eb10..6555b8a32c 100644
--- a/diff.c
+++ b/diff.c
@@ -441,8 +441,10 @@ int git_diff_ui_config(const char *var, const char *value,
}
if (!strcmp(var, "diff.wordregex"))
return git_config_string(&diff_word_regex_cfg, var, value);
- if (!strcmp(var, "diff.orderfile"))
+ if (!strcmp(var, "diff.orderfile")) {
+ FREE_AND_NULL(diff_order_file_cfg);
return git_config_pathname(&diff_order_file_cfg, var, value);
+ }
if (!strcmp(var, "diff.ignoresubmodules")) {
if (!value)
@@ -4775,7 +4777,7 @@ void repo_diff_setup(struct repository *r, struct diff_options *options)
if (diff_indent_heuristic)
DIFF_XDL_SET(options, INDENT_HEURISTIC);
- options->orderfile = diff_order_file_cfg;
+ options->orderfile = xstrdup_or_null(diff_order_file_cfg);
if (!options->flags.ignore_submodule_set)
options->flags.ignore_untracked_in_submodules = 1;
@@ -6727,6 +6729,7 @@ void diff_free(struct diff_options *options)
FREE_AND_NULL(options->objfind);
}
+ FREE_AND_NULL(options->orderfile);
for (size_t i = 0; i < options->anchors_nr; i++)
free(options->anchors[i]);
FREE_AND_NULL(options->anchors);