]> granicus.if.org Git - pdns/commitdiff
add unit test for RecordTextReader::xfrIP6, plus fix our recent IPv6 parser #ripe66...
authorbert hubert <bert.hubert@netherlabs.nl>
Wed, 15 May 2013 12:21:01 +0000 (14:21 +0200)
committerbert hubert <bert.hubert@netherlabs.nl>
Wed, 15 May 2013 12:22:22 +0000 (14:22 +0200)
Thanks to Simon Hitzemann for discovering the issue (which was never in any released powerdns version)

pdns/Makefile.am
pdns/rcpgenerator.cc
pdns/test-rcpgenerator_cc.cc [new file with mode: 0644]

index d17abc5021c5b583cd292ad54545246a35c25f2c..af8e33eb6a118f3c11ea5f6e6999c18948103815 100644 (file)
@@ -250,7 +250,7 @@ testrunner_SOURCES=testrunner.cc test-misc_hh.cc test-nameserver_cc.cc test-dnsr
        md5.cc test-base64_cc.cc test-iputils_hh.cc test-dns_random_hh.cc aes/dns_random.cc \
        aes/aescpp.h \
        aes/aescrypt.c aes/aes.h aes/aeskey.c aes/aes_modes.c aes/aesopt.h \
-       aes/aestab.c aes/aestab.h aes/brg_endian.h aes/brg_types.h
+       aes/aestab.c aes/aestab.h aes/brg_endian.h aes/brg_types.h test-rcpgenerator_cc.cc
 
 testrunner_LDFLAGS= @DYNLINKFLAGS@ @THREADFLAGS@ $(BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS)
 testrunner_LDADD= ext/polarssl-1.1.2/library/libpolarssl.a $(BOOST_UNIT_TEST_FRAMEWORK_LIBS)
index 269967110716e6c1ee5694e59cd5f12e8f3dc852..55295dc6477a42eddff5ed5d308cfd0ea30be99c 100644 (file)
@@ -126,22 +126,24 @@ void RecordTextReader::xfrIP(uint32_t &val)
 
 void RecordTextReader::xfrIP6(std::string &val)
 {
-  char addrbuf[40];
   struct in6_addr tmpbuf;
 
   skipSpaces();
-  if(!isxdigit(d_string.at(d_pos)))
-    throw RecordTextException("while parsing IPv6 address, expected xdigits at position "+lexical_cast<string>(d_pos)+" in '"+d_string+"'");
   
   size_t len;
   // lookup end of value
-  for(len=0; len < sizeof(addrbuf) && d_pos+len < d_string.length() && (isxdigit(d_string.at(d_pos+len)) || d_string.at(d_pos+len) == ':');len++);
+  for(len=0; 
+    d_pos+len < d_string.length() && (isxdigit(d_string.at(d_pos+len)) || d_string.at(d_pos+len) == ':');
+    len++);
 
-  // end of value is here, try parse as IPv6
-  d_string.copy(addrbuf, len, d_pos);
+  if(!len)
+    throw RecordTextException("while parsing IPv6 address, expected xdigits at position "+lexical_cast<string>(d_pos)+" in '"+d_string+"'");
 
-  if (inet_pton(AF_INET6, addrbuf, &tmpbuf) != 1) {
-    throw RecordTextException("while parsing IPv6 address: '" + std::string(addrbuf) + "' is invalid");
+  // end of value is here, try parse as IPv6
+  string address=d_string.substr(d_pos, len);
+  
+  if (inet_pton(AF_INET6, address.c_str(), &tmpbuf) != 1) {
+    throw RecordTextException("while parsing IPv6 address: '" + address + "' is invalid");
   }
 
   val = std::string((char*)tmpbuf.s6_addr, 16);
diff --git a/pdns/test-rcpgenerator_cc.cc b/pdns/test-rcpgenerator_cc.cc
new file mode 100644 (file)
index 0000000..9274372
--- /dev/null
@@ -0,0 +1,31 @@
+#define BOOST_TEST_DYN_LINK
+#define BOOST_TEST_NO_MAIN
+
+#include <boost/test/unit_test.hpp>
+#include "rcpgenerator.hh"
+#include "misc.hh"
+#include <utility>
+
+using std::string;
+
+BOOST_AUTO_TEST_SUITE(rcp_generator_cc)
+
+BOOST_AUTO_TEST_CASE(test_xfrIP6) {
+       RecordTextReader rtr("::1");
+       string rawIPv6;
+       rtr.xfrIP6(rawIPv6);
+       string loopback6;
+       loopback6.append(15, 0);
+       loopback6.append(1,1);
+       BOOST_CHECK_EQUAL(makeHexDump(rawIPv6), makeHexDump(loopback6));
+       
+       RecordTextReader rtr2("2a01:4f8:d12:1880::5");
+       rtr2.xfrIP6(rawIPv6);
+       string ip6("\x2a\x01\x04\xf8\x0d\x12\x18\x80\x00\x00\x00\x00\x00\x00\x00\x05", 16);
+       BOOST_CHECK_EQUAL(makeHexDump(rawIPv6), makeHexDump(ip6));
+       
+       
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+