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 <m...@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.1.16.gaa70619.dirty

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to