diff options
author | Junio C Hamano <gitster@pobox.com> | 2010-01-27 14:56:42 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-01-27 14:56:42 -0800 |
commit | 68186857a9bb0a71e9456155623e02d398a5b817 (patch) | |
tree | a8c9a2b0a6d27f15739cb357850d9f5fb72125f7 | |
parent | a0075d9e6ae211e8bde3eb40c8cdebb1772ee680 (diff) | |
parent | 9aa5053d9ffc7fade885b58a34175b4907b1a4f8 (diff) | |
download | git-68186857a9bb0a71e9456155623e02d398a5b817.tar.gz |
Merge branch 'il/maint-colon-address'
* il/maint-colon-address:
Allow use of []-wrapped addresses in git://
Support addresses with ':' in git-daemon
-rw-r--r-- | connect.c | 10 | ||||
-rw-r--r-- | daemon.c | 34 |
2 files changed, 38 insertions, 6 deletions
@@ -502,12 +502,18 @@ struct child_process *git_connect(int fd[2], const char *url_orig, c = ':'; } + /* + * Don't do destructive transforms with git:// as that + * protocol code does '[]' dewrapping of its own. + */ if (host[0] == '[') { end = strchr(host + 1, ']'); if (end) { - *end = 0; + if (protocol != PROTO_GIT) { + *end = 0; + host++; + } end++; - host++; } else end = host; } else @@ -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 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. */ @@ -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); } |