]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Handle an empty servers list in the RR policy 9382/head
authorRemi Gacogne <rgacogne+github@valombre.net>
Mon, 24 Aug 2020 07:54:44 +0000 (09:54 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 24 Aug 2020 08:03:44 +0000 (10:03 +0200)
Co-authored-by: Otto Moerbeek <otto.moerbeek@open-xchange.com>
pdns/dnsdistdist/dnsdist-lbpolicies.cc
pdns/dnsdistdist/test-dnsdistlbpolicies_cc.cc

index 62f963ddef2a1536f3b22df32be286b75d7668c5..b4268364f7d6864c2051123c152e9e73a7838de0 100644 (file)
@@ -199,6 +199,10 @@ shared_ptr<DownstreamState> chashed(const ServerPolicy::NumberedServerVector& se
 
 shared_ptr<DownstreamState> roundrobin(const ServerPolicy::NumberedServerVector& servers, const DNSQuestion* dq)
 {
+  if (servers.empty()) {
+    return shared_ptr<DownstreamState>();
+  }
+
   vector<size_t> candidates;
   candidates.reserve(servers.size());
 
index 8e37c3f7ccc0643a776200d852ddf885a1506e50..6c85b6243b0c806f39f585b833f6a9684b47cbc9 100644 (file)
@@ -178,11 +178,17 @@ BOOST_AUTO_TEST_CASE(test_roundRobin) {
 
   ServerPolicy pol{"roundrobin", roundrobin, false};
   ServerPolicy::NumberedServerVector servers;
+
+  /* selecting a server on an empty server list */
+  g_roundrobinFailOnNoServer = false;
+  auto server = getSelectedBackendFromPolicy(pol, servers, dq);
+  BOOST_CHECK(server == nullptr);
+
   servers.push_back({ 1, std::make_shared<DownstreamState>(ComboAddress("192.0.2.1:53")) });
 
   /* servers start as 'down' but the RR policy returns a server unless g_roundrobinFailOnNoServer is set */
   g_roundrobinFailOnNoServer = true;
-  auto server = getSelectedBackendFromPolicy(pol, servers, dq);
+  server = getSelectedBackendFromPolicy(pol, servers, dq);
   BOOST_CHECK(server == nullptr);
   g_roundrobinFailOnNoServer = false;
   server = getSelectedBackendFromPolicy(pol, servers, dq);