diff options
| author | Patrick Steinhardt <ps@pks.im> | 2024-11-05 07:17:00 +0100 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2024-11-04 22:37:52 -0800 |
| commit | 8dd3cb4b45d06959f3344f02b2d45a4ccf8207d8 (patch) | |
| tree | f41ba7c0478f6829dc00b8135b7ffedfc3a109ea | |
| parent | e29ff075e082ecdc6ee85baea83d32d4a055d186 (diff) | |
| download | git-8dd3cb4b45d06959f3344f02b2d45a4ccf8207d8.tar.gz | |
diff-lib: fix leaking diffopts in `do_diff_cache()`
In `do_diff_cache()` we initialize a new `rev_info` and then overwrite
its `diffopt` with a user-provided set of options. This can leak memory
because `repo_init_revisions()` may end up allocating memory for the
`diffopt` itself depending on the configuration. And since that field is
overwritten we won't ever free it.
Plug the memory leak by releasing the diffopts before we overwrite them.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
| -rw-r--r-- | diff-lib.c | 1 | ||||
| -rwxr-xr-x | t/t7610-mergetool.sh | 1 |
2 files changed, 2 insertions, 0 deletions
diff --git a/diff-lib.c b/diff-lib.c index 6b14b95962..3cf353946f 100644 --- a/diff-lib.c +++ b/diff-lib.c @@ -661,6 +661,7 @@ int do_diff_cache(const struct object_id *tree_oid, struct diff_options *opt) repo_init_revisions(opt->repo, &revs, NULL); copy_pathspec(&revs.prune_data, &opt->pathspec); + diff_free(&revs.diffopt); revs.diffopt = *opt; revs.diffopt.no_free = 1; diff --git a/t/t7610-mergetool.sh b/t/t7610-mergetool.sh index 22b3a85b3e..5c5e79e990 100755 --- a/t/t7610-mergetool.sh +++ b/t/t7610-mergetool.sh @@ -10,6 +10,7 @@ Testing basic merge tool invocation' GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME +TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh # All the mergetool test work by checking out a temporary branch based |
