]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Small speedup for getEDNSUDPPayloadSizeAndZ()
authorRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 18 Jul 2025 10:07:12 +0000 (12:07 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 18 Jul 2025 12:08:25 +0000 (14:08 +0200)
Signed-off-by: Remi Gacogne <remi.gacogne@powerdns.com>
pdns/dnsparser.cc
pdns/dnsparser.hh

index 9419ddb4294b66e8bc5466e418eb35306c2f31a4..93ff63dd11d590beb32579c639cc63798f22b734 100644 (file)
@@ -1161,6 +1161,10 @@ bool getEDNSUDPPayloadSizeAndZ(const char* packet, size_t length, uint16_t* payl
   try
   {
     const dnsheader_aligned dh(packet);
+    if (dh->arcount == 0) {
+      return false;
+    }
+
     DNSPacketMangler dpm(const_cast<char*>(packet), length);
 
     const uint16_t qdcount = ntohs(dh->qdcount);
@@ -1172,17 +1176,18 @@ bool getEDNSUDPPayloadSizeAndZ(const char* packet, size_t length, uint16_t* payl
     const size_t numrecords = ntohs(dh->ancount) + ntohs(dh->nscount) + ntohs(dh->arcount);
     for(size_t n = 0; n < numrecords; ++n) {
       dpm.skipDomainName();
-      const uint16_t dnstype = dpm.get16BitInt();
-      const uint16_t dnsclass = dpm.get16BitInt();
+      const auto dnstype = dpm.get16BitInt();
 
-      if(dnstype == QType::OPT) {
+      if (dnstype == QType::OPT) {
+        const auto dnsclass = dpm.get16BitInt();
         /* skip extended rcode and version */
         dpm.skipBytes(2);
         *z = dpm.get16BitInt();
         *payloadSize = dnsclass;
         return true;
       }
-
+      /* skip class */
+      dpm.skipBytes(2);
       /* TTL */
       dpm.skipBytes(4);
       dpm.skipRData();
index 7a728afc254223fae4cb22ec3c8822798ec8fd7f..7bd667dee395618ee8a68ed83d90b589a4b807a1 100644 (file)
@@ -610,7 +610,7 @@ public:
 
   void skipRData()
   {
-    int toskip = get16BitInt();
+    auto toskip = get16BitInt();
     moveOffset(toskip);
   }