Thread (7 messages) 7 messages, 3 authors, 2023-05-09
STALE1159d

[PATCH 2/2] diff: plug leaks in dirstat

From: Junio C Hamano <hidden>
Date: 2023-05-05 21:19:25
Subsystem: the rest · Maintainer: Linus Torvalds

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 <redacted>
---
 diff.c                  | 17 +++++++++++------
 t/t4047-diff-dirstat.sh |  2 ++
 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
-- 
2.40.1-476-g69c786637d
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help