]> granicus.if.org Git - pdns/commitdiff
smarter label decompression
authorPeter van Dijk <peter.van.dijk@netherlabs.nl>
Mon, 22 Oct 2012 13:06:33 +0000 (13:06 +0000)
committerPeter van Dijk <peter.van.dijk@netherlabs.nl>
Mon, 22 Oct 2012 13:06:33 +0000 (13:06 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@2822 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/dnsparser.cc

index a983a3f1ce12f3a9a63cbdea292cf2b1d7941fa1..d03aaea5226aba41d3f71334500acde09975aee9 100644 (file)
@@ -430,7 +430,7 @@ string PacketReader::getText(bool multi)
 
 void PacketReader::getLabelFromContent(const vector<uint8_t>& content, uint16_t& frompos, string& ret, int recurs) 
 {
-  if(recurs > 10)
+  if(recurs > 1000) // the forward reference-check below should make this test 100% obsolete
     throw MOADNSException("Loop");
 
   for(;;) {
@@ -444,6 +444,9 @@ void PacketReader::getLabelFromContent(const vector<uint8_t>& content, uint16_t&
     if((labellen & 0xc0) == 0xc0) {
       uint16_t offset=256*(labellen & ~0xc0) + (unsigned int)content.at(frompos++) - sizeof(dnsheader);
       //        cout<<"This is an offset, need to go to: "<<offset<<endl;
+
+      if(offset >= frompos-2)
+        throw MOADNSException("forward reference during label decompression");
       return getLabelFromContent(content, offset, ret, ++recurs);
     }
     else {