Merge branch 'np/compress-loose-object-memsave' into maint
[gitweb.git] / daemon.c
index 360635eb1c14608b44568ce39d969eb8822e688d..3769b6f570f20ed320fd5345281a5577c80d0a58 100644 (file)
--- a/daemon.c
+++ b/daemon.c
@@ -399,6 +399,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 request ('[' 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.
  */
@@ -415,11 +442,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);
                                }