From: bert hubert Date: Wed, 15 May 2013 12:21:01 +0000 (+0200) Subject: add unit test for RecordTextReader::xfrIP6, plus fix our recent IPv6 parser #ripe66... X-Git-Tag: auth-3.3-rc1~53 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8d388c481ca8289549a1a4b0e5d37585a69b3b43;p=thirdparty%2Fpdns.git add unit test for RecordTextReader::xfrIP6, plus fix our recent IPv6 parser #ripe66 commit Thanks to Simon Hitzemann for discovering the issue (which was never in any released powerdns version) --- diff --git a/pdns/Makefile.am b/pdns/Makefile.am index d17abc5021..af8e33eb6a 100644 --- a/pdns/Makefile.am +++ b/pdns/Makefile.am @@ -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) diff --git a/pdns/rcpgenerator.cc b/pdns/rcpgenerator.cc index 2699671107..55295dc647 100644 --- a/pdns/rcpgenerator.cc +++ b/pdns/rcpgenerator.cc @@ -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(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(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 index 0000000000..927437266f --- /dev/null +++ b/pdns/test-rcpgenerator_cc.cc @@ -0,0 +1,31 @@ +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_NO_MAIN + +#include +#include "rcpgenerator.hh" +#include "misc.hh" +#include + +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() +