]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Better test setup and also log if we hit the limit 8987/head
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Fri, 3 Apr 2020 09:26:18 +0000 (11:26 +0200)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Fri, 3 Apr 2020 10:18:07 +0000 (12:18 +0200)
pdns/recursordist/test-syncres_cc2.cc
pdns/syncres.cc

index 3e8d15917f684190ed6ecd02be4c1d8a524f4746..3bc3d59e546ff91d5f61e53da1d266d474756ed2 100644 (file)
@@ -5,7 +5,7 @@
 
 BOOST_AUTO_TEST_SUITE(syncres_cc2)
 
-BOOST_AUTO_TEST_CASE(test_referral_depth)
+void do_test_referral_depth(bool limited)
 {
   std::unique_ptr<SyncRes> sr;
   initSR(sr);
@@ -54,32 +54,46 @@ BOOST_AUTO_TEST_CASE(test_referral_depth)
     return 0;
   });
 
-  /* Set the maximum depth low */
-  SyncRes::s_maxdepth = 10;
-
-  try {
-    vector<DNSRecord> ret;
-    sr->beginResolve(target, QType(QType::A), QClass::IN, ret);
-    BOOST_CHECK(false);
+  if (limited) {
+    /* Set the maximum depth low */
+    SyncRes::s_maxdepth = 10;
+    try {
+      vector<DNSRecord> ret;
+      sr->beginResolve(target, QType(QType::A), QClass::IN, ret);
+      BOOST_CHECK(false);
+    }
+    catch (const ImmediateServFailException& e) {
+      BOOST_CHECK(e.reason.find("max-recursion-depth") != string::npos);
+    }
   }
-  catch (const ImmediateServFailException& e) {
-    BOOST_CHECK(e.reason.find("max-recursion-depth") != string::npos);
+  else {
+    // Check if the setup with high limit is OK.
+    SyncRes::s_maxdepth = 50;
+    try {
+      vector<DNSRecord> ret;
+      int rcode = sr->beginResolve(target, QType(QType::A), QClass::IN, ret);
+      BOOST_CHECK_EQUAL(rcode, RCode::NoError);
+      BOOST_REQUIRE_EQUAL(ret.size(), 1U);
+      BOOST_CHECK_EQUAL(ret[0].d_name, target);
+      BOOST_REQUIRE(ret[0].d_type == QType::A);
+      BOOST_CHECK(getRR<ARecordContent>(ret[0])->getCA() == ComboAddress("192.0.2.2"));
+    }
+    catch (const ImmediateServFailException& e) {
+      BOOST_CHECK(false);
+    }
   }
+}
 
-  // Then check if the setup with high limit is OK.
-  SyncRes::s_maxdepth = 50;
-  try {
-    vector<DNSRecord> ret;
-    int rcode = sr->beginResolve(target, QType(QType::A), QClass::IN, ret);
-    BOOST_CHECK_EQUAL(rcode, RCode::NoError);
-    BOOST_CHECK_EQUAL(ret.size(), 1U);
-    BOOST_CHECK_EQUAL(ret[0].d_name, target);
-    BOOST_REQUIRE(ret[0].d_type == QType::A);
-    BOOST_CHECK(getRR<ARecordContent>(ret[0])->getCA() == ComboAddress("192.0.2.2"));
-  }
-  catch (const ImmediateServFailException& e) {
-    BOOST_CHECK(false);
-  }
+BOOST_AUTO_TEST_CASE(test_referral_depth)
+{
+  // Test with limit
+  do_test_referral_depth(true);
+}
+
+BOOST_AUTO_TEST_CASE(test_referral_depth_ok)
+{
+  // Test with default limit
+  do_test_referral_depth(false);
 }
 
 BOOST_AUTO_TEST_CASE(test_cname_qperq)
index 024cf09efa4fb878b3f32d3018d490f05dff965f..2d8e791b8e267e2ca46961b46c9baecac88cd6a0 100644 (file)
@@ -782,9 +782,11 @@ int SyncRes::doResolveNoQNameMinimization(const DNSName &qname, const QType &qty
 
   state = Indeterminate;
 
-  if(s_maxdepth && depth > s_maxdepth)
-    throw ImmediateServFailException("More than "+std::to_string(s_maxdepth)+" (max-recursion-depth) levels of recursion needed while resolving "+qname.toLogString());
-
+  if (s_maxdepth && depth > s_maxdepth) {
+    string msg = "More than " + std::to_string(s_maxdepth) + " (max-recursion-depth) levels of recursion needed while resolving " + qname.toLogString();
+    LOG(prefix << qname << ": " << msg << endl);
+    throw ImmediateServFailException(msg);
+  }
   int res=0;
 
   // This is a difficult way of expressing "this is a normal query", i.e. not getRootNS.