]> granicus.if.org Git - pdns/commitdiff
actually honour the startRecord compress parameter
authorPeter van Dijk <peter.van.dijk@powerdns.com>
Mon, 8 Jul 2019 15:39:35 +0000 (17:39 +0200)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Wed, 10 Jul 2019 09:47:08 +0000 (11:47 +0200)
(cherry picked from commit 02e7763f2c7f4d2c9d7bab3a3319df1724065ef2)

pdns/dnswriter.cc
pdns/dnswriter.hh
pdns/test-dnswriter_cc.cc

index 24dad7c0b6d4f5686425ea79ed9bf2d85e6e9997..ca95cc2435199c21d5a2a890eae78fa72880f44a 100644 (file)
@@ -76,6 +76,7 @@ dnsheader* DNSPacketWriter::getHeader()
 
 void DNSPacketWriter::startRecord(const DNSName& name, uint16_t qtype, uint32_t ttl, uint16_t qclass, DNSResourceRecord::Place place, bool compress)
 {
+  d_compress = compress;
   commit();
   d_rollbackmarker=d_content.size();
 
@@ -327,7 +328,7 @@ void DNSPacketWriter::xfrName(const DNSName& name, bool compress, bool)
 
   uint16_t li=0;
   uint16_t matchlen=0;
-  if(compress && (li=lookupName(name, &matchlen)) && li < 16384) {
+  if(d_compress && compress && (li=lookupName(name, &matchlen)) && li < 16384) {
     const auto& dns=name.getStorage(); 
     if(l_verbose)
       cout<<"Found a substring of "<<matchlen<<" bytes from the back, offset: "<<li<<", dnslen: "<<dns.size()<<endl;
index f21b6e543f2d108ea48a5ac8afe11f93ad8fa7ba..16048f16e7dca16fc52031338198f1f9b793afa7 100644 (file)
@@ -167,7 +167,7 @@ private:
 
   uint16_t d_truncatemarker; // end of header, for truncate
   DNSResourceRecord::Place d_recordplace;
-  bool d_canonic, d_lowerCase;
+  bool d_canonic, d_lowerCase, d_compress{false};
 };
 
 typedef vector<pair<string::size_type, string::size_type> > labelparts_t;
index b9baa0593eab7d85402b73d8543f12ce9f909149..d4158b824e2c5096f3af9b333391c1a5d0b13355 100644 (file)
 
 BOOST_AUTO_TEST_SUITE(test_dnswriter_cc)
 
+BOOST_AUTO_TEST_CASE(test_compressionBool) {
+  auto testCompressionBool = [](bool compress, size_t size1, size_t size2) {
+    DNSName name("powerdns.com.");
+
+    vector<uint8_t> packet;
+    DNSPacketWriter pwR(packet, name, QType::A, QClass::IN, 0);
+    pwR.getHeader()->qr = 1;
+
+    pwR.startRecord(DNSName("mediumsizedlabel.example.net"), QType::A, 3600, QClass::IN, DNSResourceRecord::ANSWER, compress);
+    pwR.xfrIP('P'<<24 |
+              'Q'<<16 |
+              'R'<<8  |
+              'S');
+    pwR.commit();
+    BOOST_CHECK_EQUAL(pwR.size(), size1);
+
+    pwR.startRecord(DNSName("adifferentlabel.example.net"), QType::NS, 3600, QClass::IN, DNSResourceRecord::ANSWER, compress);
+    pwR.xfrName(DNSName("target.example.net"), true);
+    pwR.commit();
+    BOOST_CHECK_EQUAL(pwR.size(), size2);
+
+    string spacket(packet.begin(), packet.end());
+
+    BOOST_CHECK_NO_THROW(MOADNSParser mdp(false, spacket));
+  };
+
+  testCompressionBool(true, 74, 111);
+  testCompressionBool(false, 74, 133);
+}
+
 BOOST_AUTO_TEST_CASE(test_compressionBoundary) {
   DNSName name("powerdns.com.");