]> git.ipfire.org Git - thirdparty/git.git/blobdiff - daemon.c
Support addresses with ':' in git-daemon
[thirdparty/git.git] / daemon.c
index 1b5ada6648da66d14dec6c399898916920582852..d37f36e87022290e4489ebf07db56a3f0e14c8bb 100644 (file)
--- a/daemon.c
+++ b/daemon.c
@@ -445,6 +445,33 @@ static char *xstrdup_tolower(const char *str)
        return dup;
 }
 
+static void parse_host_and_port(char *hostport, char **host,
+       char **port)
+{
+       if (*hostport == '[') {
+               char *end;
+
+               end = strchr(hostport, ']');
+               if (!end)
+                       die("Invalid reqeuest ('[' without ']')");
+               *end = '\0';
+               *host = hostport + 1;
+               if (!end[1])
+                       *port = NULL;
+               else if (end[1] == ':')
+                       *port = end + 2;
+               else
+                       die("Garbage after end of host part");
+       } else {
+               *host = hostport;
+               *port = strrchr(hostport, ':');
+               if (*port) {
+                       *port = '\0';
+                       ++*port;
+               }
+       }
+}
+
 /*
  * Read the host as supplied by the client connection.
  */
@@ -461,11 +488,10 @@ static void parse_host_arg(char *extra_args, int buflen)
                        vallen = strlen(val) + 1;
                        if (*val) {
                                /* Split <host>:<port> at colon. */
-                               char *host = val;
-                               char *port = strrchr(host, ':');
+                               char *host;
+                               char *port;
+                               parse_host_and_port(val, &host, &port);
                                if (port) {
-                                       *port = 0;
-                                       port++;
                                        free(tcp_port);
                                        tcp_port = xstrdup(port);
                                }