From: Chris Hofstaedtler Date: Tue, 5 Dec 2017 17:13:25 +0000 (+0100) Subject: Handle bracketed IPv6 addresses without ports X-Git-Tag: dnsdist-1.3.0~205^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0047d7343bfb6e1ddd3b8fb5894f283b0f0a7343;p=pdns Handle bracketed IPv6 addresses without ports dnsdist's newServer source parameter is documented to take values of those forms (plus some more): - v4 address ("192.0.2.1") - v6 address ("2001:DB8::1") For consistency, bracketed addresses should work too, and all of them should have a test. --- diff --git a/pdns/dnsdistdist/Makefile.am b/pdns/dnsdistdist/Makefile.am index e31b373c7..d856cfdfc 100644 --- a/pdns/dnsdistdist/Makefile.am +++ b/pdns/dnsdistdist/Makefile.am @@ -178,6 +178,7 @@ testrunner_SOURCES = \ test-dnsdist_cc.cc \ test-dnsdistpacketcache_cc.cc \ test-dnscrypt_cc.cc \ + test-iputils_hh.cc \ dnsdist.hh \ dnsdist-cache.cc dnsdist-cache.hh \ dnsdist-ecs.cc dnsdist-ecs.hh \ diff --git a/pdns/dnsdistdist/test-iputils_hh.cc b/pdns/dnsdistdist/test-iputils_hh.cc new file mode 120000 index 000000000..5536c3e9d --- /dev/null +++ b/pdns/dnsdistdist/test-iputils_hh.cc @@ -0,0 +1 @@ +../test-iputils_hh.cc \ No newline at end of file diff --git a/pdns/misc.cc b/pdns/misc.cc index 464345069..d355324d5 100644 --- a/pdns/misc.cc +++ b/pdns/misc.cc @@ -716,15 +716,21 @@ int makeIPv6sockaddr(const std::string& addr, struct sockaddr_in6* ret) unsigned int port; if(addr[0]=='[') { // [::]:53 style address string::size_type pos = addr.find(']'); - if(pos == string::npos || pos + 2 > addr.size() || addr[pos+1]!=':') + if(pos == string::npos) return -1; ourAddr.assign(addr.c_str() + 1, pos-1); - try { - port = pdns_stou(addr.substr(pos+2)); - portSet = true; - } - catch(std::out_of_range) { - return -1; + if (pos + 1 == addr.size()) { + port = 0; + } else { + if (pos + 2 > addr.size() || addr[pos+1]!=':') + return -1; + try { + port = pdns_stou(addr.substr(pos+2)); + portSet = true; + } + catch(std::out_of_range) { + return -1; + } } } ret->sin6_scope_id=0; diff --git a/pdns/test-iputils_hh.cc b/pdns/test-iputils_hh.cc index 9e620de33..a9edbcb3a 100644 --- a/pdns/test-iputils_hh.cc +++ b/pdns/test-iputils_hh.cc @@ -34,6 +34,15 @@ BOOST_AUTO_TEST_CASE(test_ComboAddress) { withport = ComboAddress("[::]:5300", 53); BOOST_CHECK_EQUAL(withport.sin4.sin_port, htons(5300)); + ComboAddress defaultport("213.244.168.210"); + BOOST_CHECK_EQUAL(defaultport.sin4.sin_port, htons(0)); + + defaultport = ComboAddress("[::1]"); + BOOST_CHECK_EQUAL(defaultport.sin4.sin_port, htons(0)); + + defaultport = ComboAddress("::1"); + BOOST_CHECK_EQUAL(defaultport.sin4.sin_port, htons(0)); + // Verify that 2 'empty' ComboAddresses are equal, used in syncres.hh to // signal auth-zones ComboAddress a = ComboAddress();