]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Avoid unnecessary allocations and copies with DNSName::toDNSString()
authorRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 28 Aug 2020 14:28:40 +0000 (16:28 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 28 Aug 2020 14:28:40 +0000 (16:28 +0200)
pdns/dnsdist-lua-actions.cc
pdns/dnsdist.cc
pdns/dnsname.cc
pdns/dnsparser.cc
pdns/misc.hh

index 9928fd680c3401f99c3acf8b36bc0e5388a2baae..ef47d25165ba4e93e7323021a3b9f8e6a9894ec3 100644 (file)
@@ -537,7 +537,7 @@ DNSAction::Action SpoofAction::operator()(DNSQuestion* dq, std::string* ruleresu
   uint16_t numberOfRecords = 0;
   if (!d_cname.empty()) {
     qtype = QType::CNAME;
-    totrdatalen += d_cname.toDNSString().size();
+    totrdatalen += d_cname.getStorage().size();
     numberOfRecords = 1;
   } else if (!d_rawResponse.empty()) {
     totrdatalen += d_rawResponse.size();
@@ -592,7 +592,7 @@ DNSAction::Action SpoofAction::operator()(DNSQuestion* dq, std::string* ruleresu
   bool raw = false;
 
   if (qtype == QType::CNAME) {
-    const std::string wireData = d_cname.toDNSString(); // Note! This doesn't do compression!
+    const auto& wireData = d_cname.getStorage(); // Note! This doesn't do compression!
     uint16_t rdataLen = htons(wireData.length());
     qtype = htons(qtype);
     memcpy(&recordstart[2], &qtype, sizeof(qtype));
@@ -732,7 +732,7 @@ public:
     }
     else {
       if (d_binary) {
-        std::string out = dq->qname->toDNSString();
+        const auto& out = dq->qname->getStorage();
         if (d_includeTimestamp) {
           uint64_t tv_sec = static_cast<uint64_t>(dq->queryTime->tv_sec);
           uint32_t tv_nsec = static_cast<uint32_t>(dq->queryTime->tv_nsec);
index 52d05107f5599c507d1509940eb4e0fe1bf3f340..4e62293526fc39ed09d1948fd926d1a84a05cd48 100644 (file)
@@ -311,8 +311,8 @@ static bool fixUpResponse(char** response, uint16_t* responseLen, size_t* respon
     return true;
   }
 
-  if(g_fixupCase) {
-    string realname = qname.toDNSString();
+  if (g_fixupCase) {
+    const auto& realname = qname.getStorage();
     if (*responseLen >= (sizeof(dnsheader) + realname.length())) {
       memcpy(*response + sizeof(dnsheader), realname.c_str(), realname.length());
     }
index 7ebc2c4f5be07adebedb714261e2f9cdb6db4c77..810b86a134efbb862ec1314ab9d11e1359a6abcb 100644 (file)
@@ -208,7 +208,9 @@ std::string DNSName::toDNSString() const
 
 std::string DNSName::toDNSStringLC() const
 {
-  return toLower(toDNSString()); // label lengths are always < 'A'
+  auto result = toDNSString();
+  toLowerInPlace(result); // label lengths are always < 'A'
+  return result;
 }
 
 /**
index c7f9f5d4d44af1087293ee164fdb28baec0f5e6e..58ed99a66ee8896c8a155f16aeb68ae7778aa2d6 100644 (file)
@@ -94,7 +94,7 @@ shared_ptr<DNSRecordContent> DNSRecordContent::deserialize(const DNSName& qname,
 
   /* will look like: dnsheader, 5 bytes, encoded qname, dns record header, serialized data */
 
-  string encoded=qname.toDNSString();
+  const auto& encoded = qname.getStorage();
 
   packet.resize(sizeof(dnsheader) + 5 + encoded.size() + sizeof(struct dnsrecordheader) + serialized.size());
 
index a1bc98ba29ec5b506ad4e6d3db2a4220c3527087..584408bf3e8cb1db57c45b4f2d3ab9ebebc914cd 100644 (file)
@@ -152,6 +152,7 @@ size_t readn2(int fd, void* buffer, size_t len);
 size_t readn2WithTimeout(int fd, void* buffer, size_t len, int idleTimeout, int totalTimeout=0);
 size_t writen2WithTimeout(int fd, const void * buffer, size_t len, int timeout);
 
+void toLowerInPlace(string& str);
 const string toLower(const string &upper);
 const string toLowerCanonic(const string &upper);
 bool IpToU32(const string &str, uint32_t *ip);
@@ -230,16 +231,24 @@ inline int DTime::udiffNoReset()
   return ret;
 }
 
-inline const string toLower(const string &upper)
+inline void toLowerInPlace(string& str)
 {
-  string reply(upper);
-  const size_t length = reply.length();
+  const size_t length = str.length();
   char c;
-  for(unsigned int i = 0; i < length; ++i) {
-    c = dns_tolower(upper[i]);
-    if( c != upper[i])
-      reply[i] = c;
+  for (unsigned int i = 0; i < length; ++i) {
+    c = dns_tolower(str[i]);
+    if (c != str[i]) {
+      str[i] = c;
+    }
   }
+}
+
+inline const string toLower(const string &upper)
+{
+  string reply(upper);
+
+  toLowerInPlace(reply);
+
   return reply;
 }