]> granicus.if.org Git - pdns/commitdiff
massive speedup in dnsparser getName() which previously copied the entire packet...
authorbert hubert <bert.hubert@netherlabs.nl>
Sat, 24 Oct 2015 14:25:45 +0000 (16:25 +0200)
committerbert hubert <bert.hubert@netherlabs.nl>
Sat, 24 Oct 2015 14:25:45 +0000 (16:25 +0200)
pdns/dnsparser.cc

index b2b67b4f5509b6e254db1b4850b8a69b5b5f3ed6..5b2b9faee7e28bab24bdc9d9c35e59b39643006a 100644 (file)
@@ -413,15 +413,19 @@ uint8_t PacketReader::get8BitInt()
 DNSName PacketReader::getName()
 {
   unsigned int consumed;
-  vector<uint8_t> content(d_content);
-  content.insert(content.begin(), sizeof(dnsheader), 0);
-
   try {
-    DNSName dn((const char*) content.data(), content.size(), d_pos + sizeof(dnsheader), true /* uncompress */, 0 /* qtype */, 0 /* qclass */, &consumed);
+    DNSName dn((const char*) d_content.data() - 12, d_content.size() + 12, d_pos + sizeof(dnsheader), true /* uncompress */, 0 /* qtype */, 0 /* qclass */, &consumed);
     
+    // the -12 fakery is because we don't have the header in 'd_content', but we do need to get 
+    // the internal offsets to work
     d_pos+=consumed;
     return dn;
   }
+  catch(std::range_error& re)
+    {
+      throw std::out_of_range(string("dnsname issue: ")+re.what());
+    }
+
   catch(...)
     {
       throw std::out_of_range("dnsname issue");