mailinfo: fix leaking header data

We populate the `mailinfo` arrays `p_hdr_data` and `s_hdr_data` with
data parsed from the mail headers. These arrays may end up being only
partially populated with gaps in case some of the headers do not parse
properly. This causes memory leaks because `strbuf_list_free()` will
stop iterating once it hits the first `NULL` pointer in the backing
array.

Fix this by open-coding a variant of `strbuf_list_free()` that knows to
iterate through all headers.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Patrick Steinhardt 2024-08-22 11:17:11 +02:00 committed by Junio C Hamano
parent 2df380c280
commit e5530f9c5c
2 changed files with 16 additions and 2 deletions

View file

@ -1290,8 +1290,21 @@ void clear_mailinfo(struct mailinfo *mi)
strbuf_release(&mi->inbody_header_accum);
free(mi->message_id);
strbuf_list_free(mi->p_hdr_data);
strbuf_list_free(mi->s_hdr_data);
for (size_t i = 0; header[i]; i++) {
if (!mi->p_hdr_data[i])
continue;
strbuf_release(mi->p_hdr_data[i]);
free(mi->p_hdr_data[i]);
}
free(mi->p_hdr_data);
for (size_t i = 0; header[i]; i++) {
if (!mi->s_hdr_data[i])
continue;
strbuf_release(mi->s_hdr_data[i]);
free(mi->s_hdr_data[i]);
}
free(mi->s_hdr_data);
while (mi->content < mi->content_top) {
free(*(mi->content_top));

View file

@ -5,6 +5,7 @@
test_description='git mailinfo and git mailsplit test'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh
DATA="$TEST_DIRECTORY/t5100"