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

[PATCH v5 3/9] connect: fill the host header in the git protocol with the host and port variables

From
Mike Hommey <mh@glandium.org>
Date
May 16, 2016, 00:07 UTC
Message-ID
<20160516000740.19042-4-mh@glandium.org>
In-Reply-To
<20160516000740.19042-1-mh@glandium.org>

The last use of the hostandport variable, besides being strdup'ed before being split into host and port, is to fill the host header in the git protocol.

Instead of relying on parse_connect_url() to return a host:port string that makes sense there, construct one from the host and port variables.

Signed-off-by: Mike Hommey <mh@glandium.org>
---
 connect.c | 27 ++++++++++++++++++++-------
 1 file changed, 20 insertions(+), 7 deletions(-)
diff --git a/connect.c b/connect.c
index 2a08318..ed1a00d 100644
--- a/connect.c
+++ b/connect.c
@@ -695,11 +695,24 @@ struct child_process *git_connect(int fd[2], const char *url,
 		 * connect, unless the user has overridden us in
 		 * the environment.
 		 */
-		char *target_host = getenv("GIT_OVERRIDE_VIRTUAL_HOST");
-		if (target_host)
-			target_host = xstrdup(target_host);
-		else
-			target_host = xstrdup(hostandport);
+		struct strbuf target_host = STRBUF_INIT;
+		char *override_vhost = getenv("GIT_OVERRIDE_VIRTUAL_HOST");
+		if (override_vhost)
+			strbuf_addstr(&target_host, override_vhost);
+		else {
+			/* If the host contains a colon (ipv6 address), it
+			 * needs to be enclosed with square brackets. */
+			const char *colon = strchr(host, ':');
+			if (colon)
+				strbuf_addch(&target_host, '[');
+			strbuf_addstr(&target_host, host);
+			if (colon)
+				strbuf_addch(&target_host, ']');
+			if (port) {
+				strbuf_addch(&target_host, ':');
+				strbuf_addstr(&target_host, port);
+			}
+		}
 
 		transport_check_allowed("git");
 
@@ -720,8 +733,8 @@ struct child_process *git_connect(int fd[2], const char *url,
 		packet_write(fd[1],
 			     "%s %s%chost=%s%c",
 			     prog, path, 0,
-			     target_host, 0);
-		free(target_host);
+			     target_host.buf, 0);
+		strbuf_release(&target_host);
 	} else {
 		conn = xmalloc(sizeof(*conn));
 		child_process_init(conn);
-- 
2.8.2.411.ga331486
Previous: Junio C HamanoNext: Mike Hommey
Message 7 of 16 in “connect: various cleanups”
  1. 0/9 connect: various cleanupsMike Hommey, May 16, 2016
  2. 1/9 connect: call get_host_and_port() earlierMike Hommey, May 16, 2016
  3. 2/9 connect: only match the host with core.gitProxyMike Hommey, May 16, 2016
  4. Junio C HamanoMay 16, 2016
  5. Mike HommeyMay 16, 2016
  6. Junio C HamanoMay 16, 2016
  7. 3/9 connect: fill the host header in the git protocol with the host and port variablesMike Hommey, May 16, 2016
  8. 4/9 connect: make parse_connect_url() return separated host and portMike Hommey, May 16, 2016
  9. Junio C HamanoMay 16, 2016
  10. Mike HommeyMay 16, 2016
  11. 5/9 connect: group CONNECT_DIAG_URL handling codeMike Hommey, May 16, 2016
  12. 6/9 connect: make parse_connect_url() return the user part of the url as a separate valueMike Hommey, May 16, 2016
  13. 7/9 connect: change the --diag-url output to separate user and hostMike Hommey, May 16, 2016
  14. 8/9 connect: actively reject git:// urls with a user partMike Hommey, May 16, 2016
  15. Junio C HamanoMay 16, 2016
  16. 9/9 connect: move ssh command line preparation to a separate functionMike Hommey, May 16, 2016

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.