From: Remi Gacogne Date: Mon, 24 Aug 2020 07:54:44 +0000 (+0200) Subject: dnsdist: Handle an empty servers list in the RR policy X-Git-Tag: rec-4.4.0-beta1~13^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F9382%2Fhead;p=thirdparty%2Fpdns.git dnsdist: Handle an empty servers list in the RR policy Co-authored-by: Otto Moerbeek --- diff --git a/pdns/dnsdistdist/dnsdist-lbpolicies.cc b/pdns/dnsdistdist/dnsdist-lbpolicies.cc index 62f963ddef..b4268364f7 100644 --- a/pdns/dnsdistdist/dnsdist-lbpolicies.cc +++ b/pdns/dnsdistdist/dnsdist-lbpolicies.cc @@ -199,6 +199,10 @@ shared_ptr chashed(const ServerPolicy::NumberedServerVector& se shared_ptr roundrobin(const ServerPolicy::NumberedServerVector& servers, const DNSQuestion* dq) { + if (servers.empty()) { + return shared_ptr(); + } + vector candidates; candidates.reserve(servers.size()); diff --git a/pdns/dnsdistdist/test-dnsdistlbpolicies_cc.cc b/pdns/dnsdistdist/test-dnsdistlbpolicies_cc.cc index 8e37c3f7cc..6c85b6243b 100644 --- a/pdns/dnsdistdist/test-dnsdistlbpolicies_cc.cc +++ b/pdns/dnsdistdist/test-dnsdistlbpolicies_cc.cc @@ -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(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);