]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Fix EDNS in ServFail generated when no server is available 10012/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 26 Jan 2021 11:53:59 +0000 (12:53 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 26 Jan 2021 11:53:59 +0000 (12:53 +0100)
pdns/dnsdist.cc
regression-tests.dnsdist/test_Routing.py

index de81b75317170fc974028fdc199f487e9d68cd7e..d0951a6042c0362c34ce948a7cef805e7d05a9d6 100644 (file)
@@ -1248,11 +1248,11 @@ ProcessQueryResult processQuery(DNSQuestion& dq, ClientState& cs, LocalHolders&
 
       vinfolog("%s query for %s|%s from %s, no policy applied", g_servFailOnNoPolicy ? "ServFailed" : "Dropped", dq.qname->toLogString(), QType(dq.qtype).getName(), dq.remote->toStringWithPort());
       if (g_servFailOnNoPolicy) {
-        restoreFlags(dq.getHeader(), dq.origFlags);
-
         dq.getHeader()->rcode = RCode::ServFail;
         dq.getHeader()->qr = true;
 
+        fixUpQueryTurnedResponse(dq, dq.origFlags);
+
         if (!prepareOutgoingResponse(holders, cs, dq, false)) {
           return ProcessQueryResult::Drop;
         }
index 8567a3a8d879a4967b46ca9e2241058f0f08fc1f..8c5e337b58e15dfd8a1589c859f7a0a1d7ee00db 100644 (file)
@@ -524,6 +524,7 @@ class TestRoutingNoServer(DNSDistTest):
         """
         Routing: No server should return ServFail
         """
+        # without EDNS
         name = 'noserver.routing.tests.powerdns.com.'
         query = dns.message.make_query(name, 'A', 'IN')
         expectedResponse = dns.message.make_response(query)
@@ -532,7 +533,19 @@ class TestRoutingNoServer(DNSDistTest):
         for method in ("sendUDPQuery", "sendTCPQuery"):
             sender = getattr(self, method)
             (_, receivedResponse) = sender(query, response=None, useQueue=False)
-            self.assertEquals(receivedResponse, expectedResponse)
+            self.checkMessageNoEDNS(expectedResponse, receivedResponse)
+
+        # now with EDNS
+        query = dns.message.make_query(name, 'A', 'IN', use_edns=True, payload=4096, want_dnssec=False)
+        expectedResponse = dns.message.make_response(query, our_payload=1232)
+        expectedResponse.set_rcode(dns.rcode.SERVFAIL)
+
+        for method in ("sendUDPQuery", "sendTCPQuery"):
+            sender = getattr(self, method)
+            (_, receivedResponse) = sender(query, response=None, useQueue=False)
+            self.checkMessageEDNSWithoutOptions(expectedResponse, receivedResponse)
+            self.assertFalse(receivedResponse.ednsflags & dns.flags.DO)
+            self.assertEquals(receivedResponse.payload, 1232)
 
 class TestRoutingWRandom(DNSDistTest):