diff options
author | Junio C Hamano <gitster@pobox.com> | 2023-05-05 14:19:17 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2023-05-05 14:24:09 -0700 |
commit | 83973981eb475ce90f829f8a5bd6ea99cd3bbd8e (patch) | |
tree | 14075bd5776ca46ea026647867272be0618d62ce /diff.c | |
parent | 34a94897e02fda653cf0c71edc2d5df207855160 (diff) | |
download | git-83973981eb475ce90f829f8a5bd6ea99cd3bbd8e.tar.gz |
diff: plug leaks in dirstat
The array of dirstat_file contained in the dirstat_dir structure is
not freed after the processing ends. Unfortunately, the member that
points at the array, .files, is incremented as the gather_dirstat()
function recursively walks it, and this needs to be plugged by
remembering the beginning of the array before gather_dirstat() mucks
with it and freeing it after we are done.
We can mark t4047 as leak-free. t4000, which is marked as
leak-free, now can exercise dirstat in it, which will happen next.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'diff.c')
-rw-r--r-- | diff.c | 17 |
1 files changed, 11 insertions, 6 deletions
@@ -2975,13 +2975,18 @@ static void conclude_dirstat(struct diff_options *options, struct dirstat_dir *dir, unsigned long changed) { - /* This can happen even with many files, if everything was renames */ - if (!changed) - return; + struct dirstat_file *to_free = dir->files; + + if (!changed) { + /* This can happen even with many files, if everything was renames */ + ; + } else { + /* Show all directories with more than x% of the changes */ + QSORT(dir->files, dir->nr, dirstat_compare); + gather_dirstat(options, dir, changed, "", 0); + } - /* Show all directories with more than x% of the changes */ - QSORT(dir->files, dir->nr, dirstat_compare); - gather_dirstat(options, dir, changed, "", 0); + free(to_free); } static void show_dirstat(struct diff_options *options) |