]> granicus.if.org Git - pdns/commitdiff
dnsdist: Fix a crash when adding an invalid packet to the cache
authorRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 2 Mar 2016 15:50:02 +0000 (16:50 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 2 Mar 2016 15:50:02 +0000 (16:50 +0100)
Reported by @rygl.

pdns/dnsdist-cache.cc

index 2d951bc56b61e6f522ea68ef4002a9d94ed91cd6..ed522109144ce5b680456c05a3d269cda0375491 100644 (file)
@@ -197,10 +197,17 @@ uint32_t DNSDistPacketCache::getKey(const DNSName& qname, uint16_t consumed, con
 {
   uint32_t result = 0;
   /* skip the query ID */
+  if (packetLen < sizeof(dnsheader))
+    throw std::range_error("Computing packet cache key for an invalid packet size");
   result = burtle(packet + 2, sizeof(dnsheader) - 2, result);
   string lc(qname.toDNSStringLC());
   result = burtle((const unsigned char*) lc.c_str(), lc.length(), result);
-  result = burtle(packet + sizeof(dnsheader) + consumed, packetLen - (sizeof(dnsheader) + consumed), result);
+  if (packetLen < sizeof(dnsheader) + consumed) {
+    throw std::range_error("Computing packet cache key for an invalid packet");
+  }
+  if (packetLen > ((sizeof(dnsheader) + consumed))) {
+    result = burtle(packet + sizeof(dnsheader) + consumed, packetLen - (sizeof(dnsheader) + consumed), result);
+  }
   result = burtle((const unsigned char*) &tcp, sizeof(tcp), result);
   return result;
 }