]> granicus.if.org Git - pdns/commitdiff
Don't create temporary strings to escape DNSName labels
authorRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 1 Jul 2019 16:49:37 +0000 (18:49 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 1 Jul 2019 16:49:37 +0000 (18:49 +0200)
pdns/dnsname.cc
pdns/dnsname.hh

index 2eb1d9a12a7b0ed544b879874a14ebc781d5b664..68ce0d2d19d833c936c036253260d3b1f56a0300 100644 (file)
@@ -177,7 +177,8 @@ std::string DNSName::toString(const std::string& separator, const bool trailing)
     const char* end = p + d_storage.size();
 
     while (p < end && *p) {
-      ret += escapeLabel(p + 1, static_cast<size_t>(*p)) + separator;
+      appendEscapedLabel(ret, p + 1, static_cast<size_t>(*p));
+      ret += separator;
       p += *p + 1;
     }
   }
@@ -430,29 +431,27 @@ size_t hash_value(DNSName const& d)
   return d.hash();
 }
 
-string DNSName::escapeLabel(const std::string& label)
+void DNSName::appendEscapedLabel(std::string& appendTo, const char* orig, size_t len)
 {
-  return escapeLabel(label.c_str(), label.size());
-}
-
-string DNSName::escapeLabel(const char* orig, size_t len)
-{
-  std::string ret;
   size_t pos = 0;
 
-  ret.reserve(len);
   while (pos < len) {
     auto p = static_cast<uint8_t>(orig[pos]);
     if(p=='.')
-      ret+="\\.";
+      appendTo+="\\.";
     else if(p=='\\')
-      ret+="\\\\";
+      appendTo+="\\\\";
     else if(p > 0x20 && p < 0x7f)
-      ret.append(1, (char)p);
+      appendTo.append(1, (char)p);
     else {
-      ret+="\\" + (boost::format("%03d") % (unsigned int)p).str();
+      char buf[] = "000";
+      auto got = snprintf(buf, sizeof(buf), "%03" PRIu8, p);
+      if (got < 0 || static_cast<size_t>(got) >= sizeof(buf)) {
+        throw std::runtime_error("Error, snprintf returned " + std::to_string(got) + " while escaping label " + std::string(orig, len));
+      }
+      appendTo.append(1, '\\');
+      appendTo += buf;
     }
     ++pos;
   }
-  return ret;
 }
index 5b571085e51ca4ac1a143495d547eadc09b69a86..68d17f7c485d1e6ee7a7bcd00f01831e6759c785 100644 (file)
@@ -150,8 +150,7 @@ private:
   string_t d_storage;
 
   void packetParser(const char* p, int len, int offset, bool uncompress, uint16_t* qtype, uint16_t* qclass, unsigned int* consumed, int depth, uint16_t minOffset);
-  static std::string escapeLabel(const std::string& orig);
-  static std::string escapeLabel(const char* orig, size_t len);
+  static void appendEscapedLabel(std::string& appendTo, const char* orig, size_t len);
   static std::string unescapeLabel(const std::string& orig);
 };