mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
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>
This commit is contained in:
committed by
Junio C Hamano
parent
ec007cde94
commit
f046127b66
@@ -2237,7 +2237,7 @@ static void fill_remote_ref_details(struct used_atom *atom, const char *refname,
|
||||
const char *merge;
|
||||
|
||||
merge = remote_ref_for_branch(branch, atom->u.remote_ref.push);
|
||||
*s = xstrdup(merge ? merge : "");
|
||||
*s = merge ? merge : xstrdup("");
|
||||
} else
|
||||
BUG("unhandled RR_* enum");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user