git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] transport: fix leak with transport helper URLs

From
Junio C Hamano <gitster@pobox.com>
Date
Aug 8, 2024, 01:11 UTC
Message-ID
<xmqq34nfn7ip.fsf@gitster.g>

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>
---
 * It turns out that Patrick planned to have an almost identical
   patch, I am queuing this "independently invented" one now,
   because a recent update to ls-remote and its tests started
   breaking the CI.
 transport.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
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)) {
-- 
2.46.0-313-g2d45963c97
Next: Patrick Steinhardt
Message 1 of 4 in “transport: fix leak with transport helper URLs”
  1. transport: fix leak with transport helper URLsJunio C Hamano, Aug 8, 2024
  2. Patrick SteinhardtAug 8, 2024
  3. Patrick SteinhardtAug 8, 2024
  4. Junio C HamanoAug 8, 2024

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.