]> granicus.if.org Git - pdns/commitdiff
Handle bracketed IPv6 addresses without ports
authorChris Hofstaedtler <chris.hofstaedtler@deduktiva.com>
Tue, 5 Dec 2017 17:13:25 +0000 (18:13 +0100)
committerChris Hofstaedtler <chris.hofstaedtler@deduktiva.com>
Tue, 5 Dec 2017 17:17:11 +0000 (18:17 +0100)
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.

pdns/dnsdistdist/Makefile.am
pdns/dnsdistdist/test-iputils_hh.cc [new symlink]
pdns/misc.cc
pdns/test-iputils_hh.cc

index e31b373c7d40b06e490afaa17e555041bc47015a..d856cfdfc38e365754c85ae6a731e66f9e59719f 100644 (file)
@@ -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 (symlink)
index 0000000..5536c3e
--- /dev/null
@@ -0,0 +1 @@
+../test-iputils_hh.cc
\ No newline at end of file
index 46434506950421c2192f6e99471887331cfdab7a..d355324d5bfcdb501bd1b38561ef9bf19fbda28e 100644 (file)
@@ -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;
index 9e620de33c3054a00a16793e3b58754db27bc815..a9edbcb3a858edf7287fa71efba794a68aacfcb4 100644 (file)
@@ -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();