summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2023-05-05 14:19:17 -0700
committerJunio C Hamano <gitster@pobox.com>2023-05-05 14:24:09 -0700
commit83973981eb475ce90f829f8a5bd6ea99cd3bbd8e (patch)
tree14075bd5776ca46ea026647867272be0618d62ce
parent34a94897e02fda653cf0c71edc2d5df207855160 (diff)
downloadgit-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>
-rw-r--r--diff.c17
-rwxr-xr-xt/t4047-diff-dirstat.sh2
2 files changed, 13 insertions, 6 deletions
diff --git a/diff.c b/diff.c
index e13d0f8b67..d52db685f7 100644
--- a/diff.c
+++ b/diff.c
@@ -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)
diff --git a/t/t4047-diff-dirstat.sh b/t/t4047-diff-dirstat.sh
index 7fec2cb9cd..70224c3da1 100755
--- a/t/t4047-diff-dirstat.sh
+++ b/t/t4047-diff-dirstat.sh
@@ -1,6 +1,8 @@
#!/bin/sh
test_description='diff --dirstat tests'
+
+TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh
# set up two commits where the second commit has these files