]> git.ipfire.org Git - thirdparty/git.git/commit
ref-filter: fix leak when formatting %(push:remoteref)
authorJeff King <peff@peff.net>
Mon, 9 Sep 2024 23:19:51 +0000 (19:19 -0400)
committerJunio C Hamano <gitster@pobox.com>
Mon, 9 Sep 2024 23:26:10 +0000 (16:26 -0700)
commitf046127b6682f98d41bb4d26164da7f1a4a8e8d0
treeaca1e1e786c7afcab3e8c08cf28681f66b0878d5
parentec007cde941226ed35434ea6443ad1ba066279cf
ref-filter: fix leak when formatting %(push:remoteref)

When we expand the %(upstream) or %(push) placeholders, we rely on
remote.c's remote_ref_for_branch() to fill in the ":refname" argument.
But that function has confusing memory ownership semantics: it may or
may not return an allocated string, depending on whether we are in
"upstream" mode or "push" mode. The caller in ref-filter.c always
duplicates the result, meaning that we leak the original in the case of
%(push:refname).

To solve this, let's make the return value from remote_ref_for_branch()
consistent, by always returning an allocated pointer. Note that the
switch to returning a non-const pointer has a ripple effect inside the
function, too. We were storing the "dst" result as a const pointer, too,
even though it is always allocated! It is the return value from
apply_refspecs(), which is always a non-const allocated string.

And then on the caller side in ref-filter.c (and this is the only caller
at all), we just need to avoid the extra duplication when the return
value is non-NULL.

This clears up one case that LSan finds in t6300, but there are more.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
ref-filter.c
remote.c
remote.h