]> git.ipfire.org Git - thirdparty/git.git/commit
fetch-pack: fix leaking sought refs
authorPatrick Steinhardt <ps@pks.im>
Tue, 24 Sep 2024 21:51:03 +0000 (17:51 -0400)
committerJunio C Hamano <gitster@pobox.com>
Wed, 25 Sep 2024 17:24:52 +0000 (10:24 -0700)
commit6f54d00439759feab82d40577d272c57d449a554
tree9e51ee867ae3afcc187895cc13de1b06777ff7aa
parent61133e6ebb9dc2fbbc2cc15eeb5b5da4232ca405
fetch-pack: fix leaking sought refs

When calling `fetch_pack()` the caller is expected to pass in a set of
sought-after refs that they want to fetch. This array gets massaged to
not contain duplicate entries, which is done by replacing duplicate refs
with `NULL` pointers. This modifies the caller-provided array, and in
case we do unset any pointers the caller now loses track of that ref and
cannot free it anymore.

Now the obvious fix would be to not only unset these pointers, but to
also free their contents. But this doesn't work because callers continue
to use those refs. Another potential solution would be to copy the array
in `fetch_pack()` so that we dont modify the caller-provided one. But
that doesn't work either because the NULL-ness of those entries is used
by callers to skip over ref entries that we didn't even try to fetch in
`report_unmatched_refs()`.

Instead, we make it the responsibility of our callers to duplicate these
arrays as needed. It ain't pretty, but it works to plug the memory leak.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/fetch-pack.c
t/t5700-protocol-v1.sh
transport.c