]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
headerFlags and ednsVersion are already in network order, add test
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Tue, 19 Nov 2024 10:02:18 +0000 (11:02 +0100)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Tue, 19 Nov 2024 10:48:23 +0000 (11:48 +0100)
contrib/ProtobufLogger.py
pdns/recursordist/pdns_recursor.cc
pdns/recursordist/rec-main.cc
regression-tests.recursor-dnssec/test_Protobuf.py

index 3538bc3249d8af6f453dce033fedbe7be37b0e6d..4a39f36a36b548437e24883b5092351a9477cbc3 100644 (file)
@@ -259,11 +259,11 @@ class PDNSPBConnHandler(object):
 
         headerFlags = "N/A"
         if msg.HasField('headerFlags'):
-            headerFlags = "0x%04X" % msg.headerFlags
+            headerFlags = "0x%04X" % socket.ntohs(msg.headerFlags)
 
         ednsVersion = "N/A"
         if msg.HasField('ednsVersion'):
-            ednsVersion = "0x%08X" % msg.ednsVersion
+            ednsVersion = "0x%08X" % socket.ntohl(msg.ednsVersion)
 
         print('[%s] %s of size %d: %s%s%s -> %s%s(%s) id: %d uuid: %s%s '
                   'requestorid: %s deviceid: %s devicename: %s serverid: %s nod: %s workerId: %s pcCacheHit: %s outgoingQueries: %s headerFlags: %s ednsVersion: %s' %
index 2291986a58c78f786fdd75a2c59403f0547ef83f..ef80d2dbcc9b516926dcfed36baa5b843e2ac64f 100644 (file)
@@ -2036,7 +2036,7 @@ void getQNameAndSubnet(const std::string& question, DNSName* dnsname, uint16_t*
     pos += 1;
     const auto* drh = reinterpret_cast<const dnsrecordheader*>(&question.at(pos)); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast)
     if (ntohs(drh->d_type) == QType::OPT) {
-      ednsVersion = htonl(drh->d_ttl);
+      ednsVersion = drh->d_ttl;
     }
     pos += sizeof(dnsrecordheader);
 
index 10d47c3e4243ba0a0eed43f1cf6774036530ab79..10213250766ec48d0c8bbb9b9ce704ff0355920f 100644 (file)
@@ -562,7 +562,7 @@ void protobufLogQuery(LocalStateHolder<LuaConfigItems>& luaconfsLocal, const boo
   for (const auto& mit : meta) {
     msg.setMeta(mit.first, mit.second.stringVal, mit.second.intVal);
   }
-  msg.setHeaderFlags(htons(*getFlagsFromDNSHeader(&header)));
+  msg.setHeaderFlags(*getFlagsFromDNSHeader(&header));
   if (ednsVersion) {
     msg.setEDNSVersion(*ednsVersion);
   }
index db6828dfb3d1780894c50c984a417123ed5bf95b..432859301e04d13d4f305055a01e3e168734a362 100644 (file)
@@ -199,6 +199,13 @@ class TestRecursorProtobuf(RecursorTest):
         self.assertTrue(msg.question.HasField('qName'))
         self.assertEqual(msg.question.qName, qname)
 
+    # This method takes wire format values to check
+    def checkProtobufHeaderFlagsAndEDNSVersion(self, msg, flags, ednsVersion):
+        self.assertTrue(msg.HasField('headerFlags'))
+        self.assertEqual(msg.headerFlags, socket.htons(flags))
+        self.assertTrue(msg.HasField('ednsVersion'))
+        self.assertEqual(msg.ednsVersion, socket.htonl(ednsVersion))
+
     def checkProtobufResponse(self, msg, protocol, response, initiator='127.0.0.1', receivedSize=None, vstate=dnsmessage_pb2.PBDNSMessage.VState.Indeterminate):
         self.assertEqual(msg.type, dnsmessage_pb2.PBDNSMessage.DNSResponseType)
         self.checkProtobufBase(msg, protocol, response, initiator, receivedSize=receivedSize)
@@ -342,6 +349,8 @@ auth-zones=example=configs/%s/example.zone""" % _confdir
         # check the protobuf messages corresponding to the UDP query and answer
         msg = self.getFirstProtobufMessage()
         self.checkProtobufQuery(msg, dnsmessage_pb2.PBDNSMessage.UDP, query, dns.rdataclass.IN, dns.rdatatype.A, name)
+        # wire format, RD and CD set in headerflags, plus DO bit in flags part of EDNS Version
+        self.checkProtobufHeaderFlagsAndEDNSVersion(msg, 0x0110, 0x00008000)
         # then the response
         msg = self.getFirstProtobufMessage()
         self.checkProtobufResponse(msg, dnsmessage_pb2.PBDNSMessage.UDP, res, '127.0.0.1')