diff options
author | Junio C Hamano <gitster@pobox.com> | 2024-08-08 02:32:56 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2024-08-08 02:38:31 +0200 |
commit | 448d51d549179bafe47e07e9434210d48fdf55c6 (patch) | |
tree | f99347e604815f05ef2640e5c775d8fadb25e47c | |
parent | The second batch (diff) | |
download | git-448d51d549179bafe47e07e9434210d48fdf55c6.tar.xz git-448d51d549179bafe47e07e9434210d48fdf55c6.zip |
transport: fix leak with transport helper URLs
Transport URLs can be prefixed with "foo::", which would tell us that
the transport uses a remote helper called "foo". We extract the helper
name by `xstrndup()`ing the prefix before the double-colons, but never
free that string.
Fix this leak by assigning the result to a separate local variable that
we can then free upon returning.
Helped-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | transport.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/transport.c b/transport.c index 12cc5b4d96..7c4af9f56f 100644 --- a/transport.c +++ b/transport.c @@ -1115,6 +1115,7 @@ static struct transport_vtable builtin_smart_vtable = { struct transport *transport_get(struct remote *remote, const char *url) { const char *helper; + char *helper_to_free = NULL; const char *p; struct transport *ret = xcalloc(1, sizeof(*ret)); @@ -1139,10 +1140,11 @@ struct transport *transport_get(struct remote *remote, const char *url) while (is_urlschemechar(p == url, *p)) p++; if (starts_with(p, "::")) - helper = xstrndup(url, p - url); + helper = helper_to_free = xstrndup(url, p - url); if (helper) { transport_helper_init(ret, helper); + free(helper_to_free); } else if (starts_with(url, "rsync:")) { die(_("git-over-rsync is no longer supported")); } else if (url_is_local_not_ssh(url) && is_file(url) && is_bundle(url, 1)) { |