aboutsummaryrefslogtreecommitdiffstats
path: root/daemon.c
diff options
context:
space:
mode:
authorIlari Liusvaara <ilari.liusvaara@elisanet.fi>2010-01-26 20:24:41 +0200
committerJunio C Hamano <gitster@pobox.com>2010-01-26 10:52:52 -0800
commite8dbd76d57806fd1305612d56d56a4cc7665c599 (patch)
tree94d73464c3d270597a73b0e64a3eacc8a731a886 /daemon.c
parent35eabd1579726d594e84fc8328a5c87693dd065a (diff)
downloadgit-e8dbd76d57806fd1305612d56d56a4cc7665c599.tar.gz
Support addresses with ':' in git-daemon
If host address could have ':' in it (e.g. numeric IPv6 address), then host and port could not be uniquely parsed. Fix this by parsing the "["<host>"]":<port> and "["<host>"]" notations. Currently the built-in git:// client would send <host>:<port> or <host> for such thing, but it doesn't matter as due to bugs, resolving address fails if <host> contains ':'. Signed-off-by: Ilari Liusvaara <ilari.liusvaara@elisanet.fi> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'daemon.c')
-rw-r--r--daemon.c34
1 files changed, 30 insertions, 4 deletions
diff --git a/daemon.c b/daemon.c
index 1b5ada6648..d37f36e870 100644
--- 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);
}