]> git.ipfire.org Git - thirdparty/git.git/commitdiff
line-log: avoid redundant copy that leaks in process_ranges
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Sun, 5 Jul 2026 08:24:22 +0000 (08:24 +0000)
committerJunio C Hamano <gitster@pobox.com>
Sun, 5 Jul 2026 16:12:10 +0000 (09:12 -0700)
When `bloom_filter_check()` indicates that a commit does not touch any
of the tracked paths, `line_log_process_ranges_arbitrary_commit()`
propagates the current ranges to the parent by calling
`line_log_data_copy()` and passing the copy to add_line_range().
However, `add_line_range()` always makes its own copy internally (via
line_log_data_copy or line_log_data_merge), so the caller's copy is
never freed and leaks every time this path is taken.

Pass range directly to `add_line_range()` instead of making a redundant
intermediate copy. The callee's internal copy handles ownership
correctly.

Pointed out by Coverity.

Assisted-by: Claude Opus 4.6
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
line-log.c

index 5fc75ae275e03ac4998045924aef43ed0fe4f05c..0179f138f702888c8a8ba77a53b4ba2904139299 100644 (file)
@@ -1141,8 +1141,7 @@ int line_log_process_ranges_arbitrary_commit(struct rev_info *rev, struct commit
 
        if (range) {
                if (commit->parents && !bloom_filter_check(rev, commit, range)) {
-                       struct line_log_data *prange = line_log_data_copy(range);
-                       add_line_range(rev, commit->parents->item, prange);
+                       add_line_range(rev, commit->parents->item, range);
                        clear_commit_line_range(rev, commit);
                } else if (commit->parents && commit->parents->next)
                        changed = process_ranges_merge_commit(rev, commit, range);