diff options
author | Ilari Liusvaara <ilari.liusvaara@elisanet.fi> | 2010-01-26 20:24:41 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-01-26 10:52:52 -0800 |
commit | e8dbd76d57806fd1305612d56d56a4cc7665c599 (patch) | |
tree | 94d73464c3d270597a73b0e64a3eacc8a731a886 /daemon.c | |
parent | 35eabd1579726d594e84fc8328a5c87693dd065a (diff) | |
download | git-e8dbd76d57806fd1305612d56d56a4cc7665c599.tar.gz git-e8dbd76d57806fd1305612d56d56a4cc7665c599.tar.xz |
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.c | 34 |
1 files changed, 30 insertions, 4 deletions
@@ -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); } |