]> granicus.if.org Git - pdns/commitdiff
fix canonical for characters > 128 and add a test
authorKees Monshouwer <mind04@monshouwer.org>
Sun, 23 Oct 2016 17:21:44 +0000 (19:21 +0200)
committermind04 <mind04@monshouwer.org>
Sun, 23 Oct 2016 18:10:51 +0000 (20:10 +0200)
pdns/dnsname.hh
pdns/misc.hh
pdns/test-dnsname_cc.cc

index 08481abfaeca713e4db4eb5db43585655063b776..fd3bf71d727f24df1eca84baedc6d2c72d451a39 100644 (file)
@@ -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: "<<res<<endl;
index fa3104d55dd4e60f7c5ae329c31bd5f757162434..d1c5dea53c773933a9d23f35f1be7809104653f6 100644 (file)
@@ -235,14 +235,14 @@ inline bool dns_isspace(char c)
   return c==' ' || c=='\t' || c=='\r' || c=='\n';
 }
 
-inline char dns_tolower(char c)
+inline unsigned char dns_tolower(unsigned char c)
 {
   if(c>='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])
index 4995ee45e87f3342719f32d1135c0eb4a04c450b..4e15668726c46e9eadbca4910a1f66d1b7e75b25 100644 (file)
@@ -541,7 +541,7 @@ BOOST_AUTO_TEST_CASE(test_compare_canonical) {
   vector<DNSName> 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.",