From 8dd3cb4b45d06959f3344f02b2d45a4ccf8207d8 Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Tue, 5 Nov 2024 07:17:00 +0100 Subject: 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 Signed-off-by: Junio C Hamano --- diff-lib.c | 1 + 1 file changed, 1 insertion(+) (limited to 'diff-lib.c') 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; -- cgit v1.2.3