From: Timo Sirainen Date: Tue, 1 Jun 2010 17:35:48 +0000 (+0100) Subject: Added support for [] around ipv6 addresses everywhere. X-Git-Tag: 2.0.beta6~82 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8eeced2d681741d4071e6b145fe26232186af34a;p=thirdparty%2Fdovecot%2Fcore.git Added support for [] around ipv6 addresses everywhere. --HG-- branch : HEAD --- diff --git a/src/config/old-set-parser.c b/src/config/old-set-parser.c index 56cfdb523b..16cba0dc07 100644 --- a/src/config/old-set-parser.c +++ b/src/config/old-set-parser.c @@ -215,6 +215,7 @@ static bool listen_has_port(const char *str) for (; *addrs != NULL; addrs++) { if (strcmp(*addrs, "*") != 0 && strcmp(*addrs, "::") != 0 && + strcmp(*addrs, "[::]") != 0 && !is_ipv4_address(*addrs) && !is_ipv6_address(*addrs)) return TRUE; diff --git a/src/lib/network.c b/src/lib/network.c index c04c5b2f85..5abc5cd835 100644 --- a/src/lib/network.c +++ b/src/lib/network.c @@ -678,11 +678,22 @@ const char *net_ip2addr(const struct ip_addr *ip) int net_addr2ip(const char *addr, struct ip_addr *ip) { + int ret; + if (strchr(addr, ':') != NULL) { /* IPv6 */ ip->family = AF_INET6; #ifdef HAVE_IPV6 - if (inet_pton(AF_INET6, addr, &ip->u.ip6) == 0) + T_BEGIN { + if (addr[0] == '[') { + /* allow [ipv6 addr] */ + unsigned int len = strlen(addr); + if (addr[len-1] == ']') + addr = t_strndup(addr+1, len-2); + } + ret = inet_pton(AF_INET6, addr, &ip->u.ip6); + } T_END; + if (ret == 0) return -1; #else ip->u.ip4.s_addr = 0; @@ -785,9 +796,18 @@ bool is_ipv4_address(const char *addr) bool is_ipv6_address(const char *addr) { + bool have_prefix = FALSE; + + if (*addr == '[') { + have_prefix = TRUE; + addr++; + } while (*addr != '\0') { - if (*addr != ':' && !i_isxdigit(*addr)) + if (*addr != ':' && !i_isxdigit(*addr)) { + if (have_prefix && *addr == ']' && addr[1] == '\0') + break; return FALSE; + } addr++; } diff --git a/src/master/service.c b/src/master/service.c index d6555b5fe9..5e6a01d652 100644 --- a/src/master/service.c +++ b/src/master/service.c @@ -70,7 +70,7 @@ resolve_ip(const char *address, const struct ip_addr **ips_r, return 0; } - if (strcmp(address, "::") == 0) { + if (strcmp(address, "::") == 0 || strcmp(address, "[::]") == 0) { /* IPv6 any */ ip_list = t_new(struct ip_addr, 1); net_get_ip_any6(ip_list);