combine-diff: fix leaking lost lines
commit1981d1eb3ecdefd2cdc665184d366728721f76e5
authorPatrick Steinhardt <ps@pks.im>
Tue, 5 Nov 2024 06:17:28 +0000 (5 07:17 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 5 Nov 2024 06:37:55 +0000 (4 22:37 -0800)
tree3c51f54546f0f42b7ba0cf9368e8a97c005798e5
parentd06e3ec858d4863baa5f918db414e890b08891d7
combine-diff: fix leaking lost lines

The `cnt` variable tracks the number of lines in a patch diff. It can
happen though that there are no newlines, in which case we'd still end
up allocating our array of `sline`s. In fact, we always allocate it with
`cnt + 2` entries: one extra entry for the deletion hunk at the end, and
another entry that we don't seem to ever populate at all but acts as a
kind of sentinel value.

When we loop through the array to clear it at the end of this function
we only loop until `lno < cnt`, and thus we may not end up releasing
whatever the two extra `sline`s contain. While that shouldn't matter for
the sentinel value, it does matter for the extra deletion hunk sline.
Regardless of that, plug this memory leak by releasing both extra
entries, which makes the logic a bit easier to reason about.

While at it, fix the formatting of a local comment, which incidentally
also provides the necessary context for why we overallocate the `sline`
array.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
combine-diff.c
t/t4038-diff-combined.sh