]> granicus.if.org Git - pdns/commitdiff
turns out we were escaping to octal, the standard is decimal. We also messed up escap...
authorbert hubert <bert.hubert@netherlabs.nl>
Mon, 23 Feb 2015 16:08:24 +0000 (17:08 +0100)
committerbert hubert <bert.hubert@netherlabs.nl>
Mon, 23 Feb 2015 16:08:24 +0000 (17:08 +0100)
pdns/dnslabeltext.rl
pdns/dnsname.cc
pdns/test-dnsname_cc.cc

index c42ceb676ea2f4796778486a7b989bbf4be944b6..fe44865f225620cbaed0bb53816858d5446fcacd 100644 (file)
@@ -126,7 +126,7 @@ deque<string> segmentDNSName(const string& input )
                 }
 
                 escaped = '\\' (([^0-9]@reportEscaped) | ([0-9]{3}$reportEscapedNumber%doneEscapedNumber));
-                plain = (ascii-'\\'-'"'-'.') $ reportPlain;
+                plain = (extend-'\\'-'.') $ reportPlain;
                 labelElement = escaped | plain;            
 
                 main := ((labelElement+ '.') >labelBegin %labelEnd)+;
@@ -137,7 +137,7 @@ deque<string> segmentDNSName(const string& input )
         }%%
 
         if ( cs < dnsname_first_final ) {
-                throw runtime_error("Unable to parse DNS name '"+input+"'");
+                throw runtime_error("Unable to parse DNS name '"+input+"': cs="+std::to_string(cs));
         }
 
         return ret;
index 043363e5bd08474ec03031b4729bec3b8e625620..67bf290a970b54ca8d25b2c9cc639cad61c20cc7 100644 (file)
@@ -79,6 +79,8 @@ bool DNSName::isPartOf(const DNSName& parent) const
 
 void DNSName::appendRawLabel(const std::string& label)
 {
+  if(label.empty())
+    throw std::range_error("no such thing as an empty label");
   if(label.size() > 63)
     throw std::range_error("label too long");
   d_labels.push_back(label);
@@ -86,6 +88,9 @@ void DNSName::appendRawLabel(const std::string& label)
 
 void DNSName::prependRawLabel(const std::string& label)
 {
+  if(label.empty())
+    throw std::range_error("no such thing as an empty label");
+
   if(label.size() > 63)
     throw std::range_error("label too long");
 
@@ -130,7 +135,7 @@ string DNSName::escapeLabel(const std::string& label)
     else if(p > 0x21 && p < 0x7e)
       ret.append(1, (char)p);
     else {
-      ret+="\\" + (boost::format("%03o") % (unsigned int)p).str();
+      ret+="\\" + (boost::format("%03d") % (unsigned int)p).str();
     }
   }
   return ret;
index b1e251de32e4664ef4ed3d24c6beca8c460405de..9eff64975a3d1ded5b179e3b84af96a482729583 100644 (file)
@@ -59,6 +59,11 @@ BOOST_AUTO_TEST_CASE(test_basic) {
   BOOST_CHECK_EQUAL(*labels.rbegin(), "example");
   BOOST_CHECK_EQUAL(labels.size(), 2);
 
+
+  DNSName build;
+  build.appendRawLabel("Donald E. Eastlake 3rd");
+  build.appendRawLabel("example");
+  BOOST_CHECK_EQUAL(build.toString(), R"(Donald\032E\.\032Eastlake\0323rd.example.)");
   try {
     DNSName broken("bert..hubert.");
     BOOST_CHECK(0);
@@ -177,6 +182,23 @@ BOOST_AUTO_TEST_CASE(test_packetParse) {
   catch(...){}
 }
 
+BOOST_AUTO_TEST_CASE(test_escaping) {
+  DNSName n;
+  string label;
+  for(int i = 0; i < 256; ++i) {
+    if(!((i+1)%63)) {
+      n.appendRawLabel(label);
+      label.clear();
+    }
+    label.append(1,(char)i);
+  }
+  if(!label.empty())
+    n.appendRawLabel(label);
+
+  DNSName n2(n.toString());
+  BOOST_CHECK(n==n2);
+}
+
 BOOST_AUTO_TEST_CASE(test_suffixmatch) {
   SuffixMatchNode smn;
   DNSName ezdns("ezdns.it.");