]> granicus.if.org Git - pdns/commitdiff
make appendRawLabel() version that accepts raw pointers (and point the std::string...
authorbert hubert <bert.hubert@netherlabs.nl>
Sun, 22 Nov 2015 22:01:32 +0000 (23:01 +0100)
committerbert hubert <bert.hubert@netherlabs.nl>
Sun, 22 Nov 2015 22:01:32 +0000 (23:01 +0100)
pdns/dnsname.cc
pdns/dnsname.hh

index c69270db98903db96cb1b74297bb9d464305f78e..b95cf01e160a7ee732515d7bc9b106206d8b2baa 100644 (file)
@@ -32,6 +32,12 @@ DNSName::DNSName(const char* p)
 
 DNSName::DNSName(const char* pos, int len, int offset, bool uncompress, uint16_t* qtype, uint16_t* qclass, unsigned int* consumed)
 {
+  if(!uncompress) {
+    if(const void * fnd=memchr(pos+offset, 0, len-offset)) {
+      d_storage.reserve(2+(const char*)fnd-(pos+offset));
+    }
+  }
+
   packetParser(pos, len, offset, uncompress, qtype, qclass, consumed);
 }
 
@@ -65,7 +71,7 @@ void DNSName::packetParser(const char* qpos, int len, int offset, bool uncompres
       break;
     }
     if (pos + labellen < end) {
-      appendRawLabel(string((const char*)pos, labellen));
+      appendRawLabel((const char*)pos, labellen);
     }
     else
       throw std::range_error("Found an invalid label length in qname");
@@ -176,20 +182,25 @@ DNSName DNSName::labelReverse() const
 
 void DNSName::appendRawLabel(const std::string& label)
 {
-  if(label.empty())
+  appendRawLabel(label.c_str(), label.length());
+}
+
+void DNSName::appendRawLabel(const char* start, unsigned int length)
+{
+  if(length==0)
     throw std::range_error("no such thing as an empty label to append");
-  if(label.size() > 63)
+  if(length > 63)
     throw std::range_error("label too long to append");
-  if(d_storage.size() + label.size() > 254) // reserve two bytes, one for length and one for the root label
+  if(d_storage.size() + length > 254) // reserve two bytes, one for length and one for the root label
     throw std::range_error("name too long to append");
 
   if(d_storage.empty()) {
-    d_storage.append(1, (char)label.size());
+    d_storage.append(1, (char)length);
   }
   else {
-    *d_storage.rbegin()=(char)label.size();
+    *d_storage.rbegin()=(char)length;
   }
-  d_storage.append(label.c_str(), label.length());
+  d_storage.append(start, length);
   d_storage.append(1, (char)0);
 }
 
index e77c108189d91ca9cbff8bcc49364594b247d675..4691d16e55d8552f873fae181113a24c2b3212b2 100644 (file)
@@ -42,6 +42,7 @@ public:
   std::string toStringNoDot() const { return toString(".", false); }
   std::string toDNSString() const;           //!< Our representation in DNS native format
   void appendRawLabel(const std::string& str); //!< Append this unescaped label
+  void appendRawLabel(const char* start, unsigned int length); //!< Append this unescaped label
   void prependRawLabel(const std::string& str); //!< Prepend this unescaped label
   std::vector<std::string> getRawLabels() const; //!< Individual raw unescaped labels
   bool chopOff();                               //!< Turn www.powerdns.com. into powerdns.com., returns false for .