]> git.ipfire.org Git - thirdparty/git.git/commitdiff
diff: fix leaking orderfile option
authorPatrick Steinhardt <ps@pks.im>
Thu, 26 Sep 2024 11:46:29 +0000 (13:46 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 27 Sep 2024 15:25:35 +0000 (08:25 -0700)
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>
combine-diff.c
diff.c
diff.h

index 829a44e4167300c2ea7a89fbeda85f405264b1ed..f6b624dc288d72bde9c4947b892a2fca684ca824 100644 (file)
@@ -1393,9 +1393,8 @@ static struct combine_diff_path *find_paths_generic(const struct object_id *oid,
 {
        struct combine_diff_path *paths = NULL;
        int i, num_parent = parents->nr;
-
        int output_format = opt->output_format;
-       const char *orderfile = opt->orderfile;
+       char *orderfile = opt->orderfile;
 
        opt->output_format = DIFF_FORMAT_NO_OUTPUT;
        /* tell diff_tree to emit paths in sorted (=tree) order */
diff --git a/diff.c b/diff.c
index 472479eb101c889020869c0dd6ca3c11688fc986..6555b8a32c1c133f3ce236762056a706ee2659b8 100644 (file)
--- 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);
diff --git a/diff.h b/diff.h
index 9901c8ca8c8e49346ee0945271c005385d88d059..b95d3c1e830a2da892b794cb86e5c803ca02ec56 100644 (file)
--- a/diff.h
+++ b/diff.h
@@ -235,7 +235,7 @@ enum diff_submodule_format {
  * diffcore library with.
  */
 struct diff_options {
-       const char *orderfile;
+       char *orderfile;
 
        /*
         * "--rotate-to=<file>" would start showing at <file> and when