From: Kees Monshouwer Date: Sun, 23 Oct 2016 17:21:44 +0000 (+0200) Subject: fix canonical for characters > 128 and add a test X-Git-Tag: dnsdist-1.1.0~4^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1352c9b6569303e8188c5f430c1ee0f6c2cebd04;p=pdns fix canonical for characters > 128 and add a test --- diff --git a/pdns/dnsname.hh b/pdns/dnsname.hh index 08481abfa..fd3bf71d7 100644 --- a/pdns/dnsname.hh +++ b/pdns/dnsname.hh @@ -53,7 +53,7 @@ uint32_t burtleCI(const unsigned char* k, uint32_t lengh, uint32_t init); NOTE: For now, everything MUST be . terminated, otherwise it is an error */ -inline char dns2_tolower(char c) +inline unsigned char dns2_tolower(unsigned char c) { if(c>='A' && c<='Z') return c+('a'-'A'); @@ -125,7 +125,7 @@ public: { return std::lexicographical_compare(d_storage.rbegin(), d_storage.rend(), rhs.d_storage.rbegin(), rhs.d_storage.rend(), - [](const char& a, const char& b) { + [](const unsigned char& a, const unsigned char& b) { return dns2_tolower(a) < dns2_tolower(b); }); // note that this is case insensitive, including on the label lengths } @@ -189,7 +189,7 @@ inline bool DNSName::canonCompare(const DNSName& rhs) const d_storage.c_str() + ourpos[ourcount] + 1 + *(d_storage.c_str() + ourpos[ourcount]), rhs.d_storage.c_str() + rhspos[rhscount] + 1, rhs.d_storage.c_str() + rhspos[rhscount] + 1 + *(rhs.d_storage.c_str() + rhspos[rhscount]), - [](const char& a, const char& b) { + [](const unsigned char& a, const unsigned char& b) { return dns2_tolower(a) < dns2_tolower(b); }); @@ -201,7 +201,7 @@ inline bool DNSName::canonCompare(const DNSName& rhs) const rhs.d_storage.c_str() + rhspos[rhscount] + 1 + *(rhs.d_storage.c_str() + rhspos[rhscount]), d_storage.c_str() + ourpos[ourcount] + 1, d_storage.c_str() + ourpos[ourcount] + 1 + *(d_storage.c_str() + ourpos[ourcount]), - [](const char& a, const char& b) { + [](const unsigned char& a, const unsigned char& b) { return dns2_tolower(a) < dns2_tolower(b); }); // cout<<"Reverse: "<='A' && c<='Z') c+='a'-'A'; return c; } -inline char dns_toupper(char c) +inline unsigned char dns_toupper(unsigned char c) { if(c>='a' && c<='z') c+='A'-'a'; @@ -266,7 +266,7 @@ inline const string toLowerCanonic(const string &upper) string reply(upper); if(!upper.empty()) { unsigned int i, limit= ( unsigned int ) reply.length(); - char c; + unsigned char c; for(i = 0; i < limit ; i++) { c = dns_tolower(upper[i]); if(c != upper[i]) diff --git a/pdns/test-dnsname_cc.cc b/pdns/test-dnsname_cc.cc index 4995ee45e..4e1566872 100644 --- a/pdns/test-dnsname_cc.cc +++ b/pdns/test-dnsname_cc.cc @@ -541,7 +541,7 @@ BOOST_AUTO_TEST_CASE(test_compare_canonical) { vector vec; for(const std::string& a : {"bert.com.", "alpha.nl.", "articles.xxx.", "Aleph1.powerdns.com.", "ZOMG.powerdns.com.", "aaa.XXX.", "yyy.XXX.", - "test.powerdns.com."}) { + "test.powerdns.com.", "\\128.com"}) { vec.push_back(DNSName(a)); } sort(vec.begin(), vec.end(), CanonDNSNameCompare()); @@ -552,6 +552,7 @@ BOOST_AUTO_TEST_CASE(test_compare_canonical) { for(const auto& a: {"bert.com.", "Aleph1.powerdns.com.", "test.powerdns.com.", "ZOMG.powerdns.com.", + "\\128.com.", "alpha.nl.", "aaa.XXX.", "articles.xxx.",