]> granicus.if.org Git - pdns/commitdiff
actually truncate packet when setting TC, closes #1092
authorPeter van Dijk <peter.van.dijk@netherlabs.nl>
Mon, 4 Nov 2013 12:44:05 +0000 (13:44 +0100)
committerPeter van Dijk <peter.van.dijk@netherlabs.nl>
Mon, 4 Nov 2013 12:44:14 +0000 (13:44 +0100)
pdns/dnswriter.cc
pdns/dnswriter.hh
pdns/pdns_recursor.cc
regression-tests.recursor/config.sh
regression-tests.recursor/truncate-empty/command [new file with mode: 0755]
regression-tests.recursor/truncate-empty/description [new file with mode: 0644]
regression-tests.recursor/truncate-empty/expected_result [new file with mode: 0644]

index cd30f37f2b2fcc34dc6dfea81f4b51fee8057efd..3bd862fa62ac6cd52db75ce8d31116c35d287653 100644 (file)
@@ -46,6 +46,7 @@ DNSPacketWriter::DNSPacketWriter(vector<uint8_t>& content, const string& qname,
 
   d_stuff=0xffff;
   d_labelmap.reserve(16);
+  d_truncatemarker=d_content.size();
 }
 
 dnsheader* DNSPacketWriter::getHeader()
@@ -294,6 +295,15 @@ void DNSPacketWriter::rollback()
   d_stuff=0;
 }
 
+void DNSPacketWriter::truncate()
+{
+  d_content.resize(d_truncatemarker);
+  d_record.clear();
+  d_stuff=0;
+  dnsheader* dh=reinterpret_cast<dnsheader*>( &*d_content.begin());
+  dh->ancount = dh->nscount = dh->arcount = 0;
+}
+
 void DNSPacketWriter::commit()
 {
   if(d_stuff==0xffff && (d_content.size()!=d_sor || !d_record.empty()))
index 7d42d0543721f2f8d3ca6721f2afdc977dc40c66..a3c36c2323e3612f60bb3ac8aff08ea357caae18 100644 (file)
@@ -61,6 +61,9 @@ public:
   /** Should the packet have grown too big for the writer's liking, rollback removes the record currently being written */
   void rollback();
 
+  /** Discard all content except the question section */
+  void truncate();
+
   void xfr48BitInt(uint64_t val);
   void xfr32BitInt(uint32_t val);
   void xfr16BitInt(uint16_t val);
@@ -120,6 +123,7 @@ private:
   uint16_t d_stuff;
   uint16_t d_sor;
   uint16_t d_rollbackmarker; // start of last complete packet, for rollback
+  uint16_t d_truncatemarker; // end of header, for truncate
   Place d_recordplace;
   bool d_canonic, d_lowerCase;
 };
index ce56b76f2236faa929ed4348533af3476ba7c30b..355bbaf0ba55b6534903b8df1cae15175b64bc56 100644 (file)
@@ -591,7 +591,10 @@ void startDoResolve(void *p)
           if(pw.size() > maxanswersize) {
             pw.rollback();
             if(i->d_place==DNSResourceRecord::ANSWER)  // only truncate if we actually omitted parts of the answer
+            {
               pw.getHeader()->tc=1;
+              pw.truncate();
+            }
             goto sendit; // need to jump over pw.commit
           }
         }
index d880bc542062c1e20d3cafca471890ad2d84b548..decaa7194d56d0511e2b4a12fce355076e2b4efb 100755 (executable)
@@ -95,6 +95,50 @@ ns2.arthur.example.net.  3600 IN A   $PREFIX.13
 www.arthur.example.net.  3600 IN A   192.0.2.2
 www2.arthur.example.net. 3600 IN A   192.0.2.6
 mail.arthur.example.net. 3600 IN A   192.0.2.3
+big.arthur.example.net.  3600 IN TXT "the quick brown fox jumps over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "The quick brown fox jumps over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THe quick brown fox jumps over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE quick brown fox jumps over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE quick brown fox jumps over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE Quick brown fox jumps over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUick brown fox jumps over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUIck brown fox jumps over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICk brown fox jumps over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK brown fox jumps over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK brown fox jumps over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK Brown fox jumps over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BRown fox jumps over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROwn fox jumps over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWn fox jumps over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN fox jumps over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN fox jumps over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN Fox jumps over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOx jumps over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX jumps over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX jumps over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX Jumps over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX JUmps over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX JUMps over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX JUMPs over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX JUMPS over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX JUMPS over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX JUMPS Over the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX JUMPS OVer the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX JUMPS OVEr the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX JUMPS OVER the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX JUMPS OVER the lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX JUMPS OVER The lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX JUMPS OVER THe lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX JUMPS OVER THE lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX JUMPS OVER THE lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX JUMPS OVER THE Lazy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX JUMPS OVER THE LAzy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX JUMPS OVER THE LAZy dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX JUMPS OVER THE LAZY dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX JUMPS OVER THE LAZY dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX JUMPS OVER THE LAZY Dog"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOg"
+big.arthur.example.net.  3600 IN TXT "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG"
 EOF
 
 mkdir $PREFIX.13
diff --git a/regression-tests.recursor/truncate-empty/command b/regression-tests.recursor/truncate-empty/command
new file mode 100755 (executable)
index 0000000..5898ab4
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+cleandig big.arthur.example.net txt | sed 's/\(.*\tIN\t[A-Z0-9]\+\t\)\([0-9]\+\)/\13600/'
diff --git a/regression-tests.recursor/truncate-empty/description b/regression-tests.recursor/truncate-empty/description
new file mode 100644 (file)
index 0000000..884b312
--- /dev/null
@@ -0,0 +1 @@
+Verify that truncated messages are empty.
diff --git a/regression-tests.recursor/truncate-empty/expected_result b/regression-tests.recursor/truncate-empty/expected_result
new file mode 100644 (file)
index 0000000..11ac812
--- /dev/null
@@ -0,0 +1,2 @@
+Rcode: 0, RD: 1, QR: 1, TC: 1, AA: 0, opcode: 0
+Reply to question for qname='big.arthur.example.net.', qtype=TXT