]> git.ipfire.org Git - thirdparty/git.git/commitdiff
diff-lib: plug minor memory leaks in do_diff_cache()
authorRené Scharfe <l.s.r@web.de>
Sat, 14 Nov 2020 18:37:03 +0000 (19:37 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 16 Nov 2020 21:45:42 +0000 (13:45 -0800)
do_diff_cache() builds a struct rev_info to hand to diff_cache() from
scratch by initializing it using repo_init_revisions() and then
replacing its diffopt and prune_data members.

The diffopt member is initialized to a heap-allocated list of options,
though.  Release it using diff_setup_done() before overwriting it.

The initial value of the prune_data member doesn't need to be released,
but the copy created using copy_pathspec() does.  Clear it after use.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff-lib.c

index f95c6de75fc843fd19f683b6217c5fe87f341cd1..68213735f49a9fa6f8f726c403d8b8b8cd29b458 100644 (file)
@@ -536,10 +536,12 @@ 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_setup_done(&revs.diffopt);
        revs.diffopt = *opt;
 
        if (diff_cache(&revs, tree_oid, NULL, 1))
                exit(128);
+       clear_pathspec(&revs.prune_data);
        return 0;
 }