]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Only add EDNS on negative answers if the query had EDNS
authorRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 29 Sep 2020 10:40:31 +0000 (12:40 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 29 Sep 2020 12:32:44 +0000 (14:32 +0200)
pdns/dnsdist-ecs.cc
pdns/test-dnsdist_cc.cc

index 30659cd7081d849820b795d80faaedca1578f5f6..76f0129c20a37e69bc8f92e59b8cdd5fbe3eec4b 100644 (file)
@@ -947,7 +947,7 @@ bool setNegativeAndAdditionalSOA(DNSQuestion& dq, bool nxd, const DNSName& zone,
 
   dq.dh->arcount = htons(1);
 
-  if (g_addEDNSToSelfGeneratedResponses) {
+  if (hadEDNS) {
     /* now we need to add a new OPT record */
     return addEDNS(dq.dh, dq.len, dq.size, dnssecOK, g_PayloadSizeSelfGenAnswers, dq.ednsRCode);
   }
index e32522433d9d4ac7c2e6824d6ac6a808c7218b0b..e24d35bc7da173e4518e52bac47d5ce8f780b188 100644 (file)
@@ -1922,12 +1922,19 @@ BOOST_AUTO_TEST_CASE(test_setNegativeAndAdditionalSOA) {
   DNSName name("www.powerdns.com.");
 
   vector<uint8_t> query;
+  vector<uint8_t> queryWithEDNS;
   DNSPacketWriter pw(query, name, QType::A, QClass::IN, 0);
   pw.getHeader()->rd = 1;
   const uint16_t len = query.size();
+  DNSPacketWriter pwEDNS(queryWithEDNS, name, QType::A, QClass::IN, 0);
+  pwEDNS.getHeader()->rd = 1;
+  pwEDNS.addOpt(1232, 0, 0);
+  pwEDNS.commit();
+  const uint16_t ednsLen = queryWithEDNS.size();
 
   /* test NXD */
   {
+    /* no incoming EDNS */
     char packet[1500];
     memcpy(packet, query.data(), query.size());
 
@@ -1941,6 +1948,32 @@ BOOST_AUTO_TEST_CASE(test_setNegativeAndAdditionalSOA) {
     BOOST_CHECK(static_cast<size_t>(dq.len) > query.size());
     MOADNSParser mdp(true, packet, dq.len);
 
+    BOOST_CHECK_EQUAL(mdp.d_qname.toString(), "www.powerdns.com.");
+    BOOST_CHECK_EQUAL(mdp.d_header.rcode, RCode::NXDomain);
+    BOOST_CHECK_EQUAL(mdp.d_header.qdcount, 1U);
+    BOOST_CHECK_EQUAL(mdp.d_header.ancount, 0U);
+    BOOST_CHECK_EQUAL(mdp.d_header.nscount, 0U);
+    BOOST_CHECK_EQUAL(mdp.d_header.arcount, 1U);
+    BOOST_REQUIRE_EQUAL(mdp.d_answers.size(), 1U);
+    BOOST_CHECK_EQUAL(mdp.d_answers.at(0).first.d_type, static_cast<uint16_t>(QType::SOA));
+    BOOST_CHECK_EQUAL(mdp.d_answers.at(0).first.d_class, QClass::IN);
+    BOOST_CHECK_EQUAL(mdp.d_answers.at(0).first.d_name, DNSName("zone."));
+  }
+  {
+    /* now with incoming EDNS */
+    char packet[1500];
+    memcpy(packet, queryWithEDNS.data(), queryWithEDNS.size());
+
+    unsigned int consumed = 0;
+    uint16_t qtype;
+    DNSName qname(packet, ednsLen, sizeof(dnsheader), false, &qtype, nullptr, &consumed);
+    auto dh = reinterpret_cast<dnsheader*>(packet);
+    DNSQuestion dq(&qname, qtype, QClass::IN, qname.wirelength(), &remote, &remote, dh, sizeof(packet), queryWithEDNS.size(), false, &queryTime);
+
+    BOOST_CHECK(setNegativeAndAdditionalSOA(dq, true, DNSName("zone."), 42, DNSName("mname."), DNSName("rname."), 1, 2, 3, 4 , 5));
+    BOOST_CHECK(static_cast<size_t>(dq.len) > queryWithEDNS.size());
+    MOADNSParser mdp(true, packet, dq.len);
+
     BOOST_CHECK_EQUAL(mdp.d_qname.toString(), "www.powerdns.com.");
     BOOST_CHECK_EQUAL(mdp.d_header.rcode, RCode::NXDomain);
     BOOST_CHECK_EQUAL(mdp.d_header.qdcount, 1U);
@@ -1957,6 +1990,7 @@ BOOST_AUTO_TEST_CASE(test_setNegativeAndAdditionalSOA) {
 
   /* test No Data */
   {
+    /* no incoming EDNS */
     char packet[1500];
     memcpy(packet, query.data(), query.size());
 
@@ -1970,6 +2004,32 @@ BOOST_AUTO_TEST_CASE(test_setNegativeAndAdditionalSOA) {
     BOOST_CHECK(static_cast<size_t>(dq.len) > query.size());
     MOADNSParser mdp(true, packet, dq.len);
 
+    BOOST_CHECK_EQUAL(mdp.d_qname.toString(), "www.powerdns.com.");
+    BOOST_CHECK_EQUAL(mdp.d_header.rcode, RCode::NoError);
+    BOOST_CHECK_EQUAL(mdp.d_header.qdcount, 1U);
+    BOOST_CHECK_EQUAL(mdp.d_header.ancount, 0U);
+    BOOST_CHECK_EQUAL(mdp.d_header.nscount, 0U);
+    BOOST_CHECK_EQUAL(mdp.d_header.arcount, 1U);
+    BOOST_REQUIRE_EQUAL(mdp.d_answers.size(), 1U);
+    BOOST_CHECK_EQUAL(mdp.d_answers.at(0).first.d_type, static_cast<uint16_t>(QType::SOA));
+    BOOST_CHECK_EQUAL(mdp.d_answers.at(0).first.d_class, QClass::IN);
+    BOOST_CHECK_EQUAL(mdp.d_answers.at(0).first.d_name, DNSName("zone."));
+  }
+  {
+    /* now with incoming EDNS */
+    char packet[1500];
+    memcpy(packet, queryWithEDNS.data(), queryWithEDNS.size());
+
+    unsigned int consumed = 0;
+    uint16_t qtype;
+    DNSName qname(packet, ednsLen, sizeof(dnsheader), false, &qtype, nullptr, &consumed);
+    auto dh = reinterpret_cast<dnsheader*>(packet);
+    DNSQuestion dq(&qname, qtype, QClass::IN, qname.wirelength(), &remote, &remote, dh, sizeof(packet), queryWithEDNS.size(), false, &queryTime);
+
+    BOOST_CHECK(setNegativeAndAdditionalSOA(dq, false, DNSName("zone."), 42, DNSName("mname."), DNSName("rname."), 1, 2, 3, 4 , 5));
+    BOOST_CHECK(static_cast<size_t>(dq.len) > queryWithEDNS.size());
+    MOADNSParser mdp(true, packet, dq.len);
+
     BOOST_CHECK_EQUAL(mdp.d_qname.toString(), "www.powerdns.com.");
     BOOST_CHECK_EQUAL(mdp.d_header.rcode, RCode::NoError);
     BOOST_CHECK_EQUAL(mdp.d_header.qdcount, 1U);