]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Add consistency checks to segmentDNSNameRaw() 3789/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 28 Apr 2016 09:59:01 +0000 (11:59 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 28 Apr 2016 10:04:58 +0000 (12:04 +0200)
This fixes most issues found by fuzzing loadRPZFromFile() with
American Fuzzy Lop.

pdns/dnslabeltext.rl
pdns/dnsname.cc

index fb3c3d210f278ecf7d2f06e50bbe421dd1b071bc..fe64966fd0cacf8f67a83dbfc3f680d112df850c 100644 (file)
@@ -111,6 +111,9 @@ DNSName::string_t segmentDNSNameRaw(const char* realinput)
         unsigned int lenpos=0;
         %%{
                 action labelEnd { 
+                        if (labellen < 0 || labellen > 63) {
+                          throw runtime_error("Unable to parse DNS name '"+string(realinput)+"': invalid label length "+std::to_string(labellen));
+                        }
                         ret[lenpos]=labellen;
                         labellen=0;
                 }
index cfc4d4bebe0507b7de44e16335f7f84f7d824781..369fb4f87079a5fe2120d95a5226f8fdce7cb633 100644 (file)
@@ -51,8 +51,12 @@ DNSName::DNSName(const char* p)
       }
       d_storage.append(1, (char)0);
     }
-    else
+    else {
       d_storage=segmentDNSNameRaw(p); 
+      if(d_storage.size() > 255) {
+        throw std::range_error("name too long");
+      }
+    }
   }
 }