]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Get rid of manual deletion of backends in UeberBackend
authorFred Morcos <fred.morcos@open-xchange.com>
Sun, 29 Oct 2023 16:47:38 +0000 (17:47 +0100)
committerFred Morcos <fred.morcos@open-xchange.com>
Mon, 30 Oct 2023 15:24:29 +0000 (16:24 +0100)
12 files changed:
modules/remotebackend/test-remotebackend-http.cc
modules/remotebackend/test-remotebackend-json.cc
modules/remotebackend/test-remotebackend-pipe.cc
modules/remotebackend/test-remotebackend-post.cc
modules/remotebackend/test-remotebackend-unix.cc
modules/remotebackend/test-remotebackend-zeromq.cc
pdns/dnsbackend.cc
pdns/dnsbackend.hh
pdns/pdnsutil.cc
pdns/test-ueberbackend_cc.cc
pdns/ueberbackend.cc
pdns/ueberbackend.hh

index 824db562037c254ffeb7e8d46c5ca45229003bfb..3123752b8a22f985915d52ee702e6accc981d59d 100644 (file)
@@ -76,7 +76,7 @@ struct RemotebackendSetup
       // then get us a instance of it
       ::arg().set("remote-connection-string") = "http:url=http://localhost:62434/dns";
       ::arg().set("remote-dnssec") = "yes";
-      be = BackendMakers().all()[0];
+      be = BackendMakers().all()[0].get();
     }
     catch (PDNSException& ex) {
       BOOST_TEST_MESSAGE("Cannot start remotebackend: " << ex.reason);
index 48d023ed829900ac58ba88fe83eab3903db9912e..6a47b772c9a0baa4f32eae8d19df4c607c3a7cd8 100644 (file)
@@ -75,7 +75,7 @@ struct RemotebackendSetup
       // then get us a instance of it
       ::arg().set("remote-connection-string") = "http:url=http://localhost:62434/dns/endpoint.json,post=1,post_json=1";
       ::arg().set("remote-dnssec") = "yes";
-      be = BackendMakers().all()[0];
+      be = BackendMakers().all()[0].get();
     }
     catch (PDNSException& ex) {
       BOOST_TEST_MESSAGE("Cannot start remotebackend: " << ex.reason);
index 6ad872c2812759c45b5709f295c6d80cb75f6ac3..15ca1571e87c270e53e997554766d6c4603693b1 100644 (file)
@@ -75,7 +75,7 @@ struct RemotebackendSetup
       // then get us a instance of it
       ::arg().set("remote-connection-string") = "pipe:command=unittest_pipe.rb";
       ::arg().set("remote-dnssec") = "yes";
-      be = BackendMakers().all()[0];
+      be = BackendMakers().all()[0].get();
       // load few record types to help out
       SOARecordContent::report();
       NSRecordContent::report();
index fe129623f16c8a51f593b6387e6d0ad449afc920..d35baa00ae2d449cc93f21e396a136add950bd14 100644 (file)
@@ -75,7 +75,7 @@ struct RemotebackendSetup
       // then get us a instance of it
       ::arg().set("remote-connection-string") = "http:url=http://localhost:62434/dns,post=1";
       ::arg().set("remote-dnssec") = "yes";
-      be = BackendMakers().all()[0];
+      be = BackendMakers().all()[0].get();
     }
     catch (PDNSException& ex) {
       BOOST_TEST_MESSAGE("Cannot start remotebackend: " << ex.reason);
index fd2c1b15a6aa9bc78bb30cbdde01bf6081ecc602..7d20a2ad32e6b6f0d738d9a5e11c3cd0ca71a9db 100644 (file)
@@ -75,7 +75,7 @@ struct RemotebackendSetup
       // then get us a instance of it
       ::arg().set("remote-connection-string") = "unix:path=/tmp/remotebackend.sock";
       ::arg().set("remote-dnssec") = "yes";
-      be = BackendMakers().all()[0];
+      be = BackendMakers().all()[0].get();
       // load few record types to help out
       SOARecordContent::report();
       NSRecordContent::report();
index bccf0768372d43b6eb7f7519a56131e58664d256..5244a6dab81cc38130c7b86177aa87eda206da13 100644 (file)
@@ -77,7 +77,7 @@ struct RemotebackendSetup
       // then get us a instance of it
       ::arg().set("remote-connection-string") = "zeromq:endpoint=ipc:///tmp/remotebackend.0";
       ::arg().set("remote-dnssec") = "yes";
-      be = BackendMakers().all()[0];
+      be = BackendMakers().all()[0].get();
       // load few record types to help out
       SOARecordContent::report();
       NSRecordContent::report();
index aef1b99a3a3bbea2b95a6d875ce5c581ae286fd1..8cceece2139077c83a0889cdc3693ba2c975bea4 100644 (file)
@@ -19,6 +19,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
+#include <memory>
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
@@ -180,12 +181,13 @@ size_t BackendMakerClass::numLauncheable() const
   return d_instances.size();
 }
 
-vector<DNSBackend *> BackendMakerClass::all(bool metadataOnly)
+vector<std::unique_ptr<DNSBackend>> BackendMakerClass::all(bool metadataOnly)
 {
-  vector<DNSBackend *> ret;
-  if(d_instances.empty())
+  if(d_instances.empty()) {
     throw PDNSException("No database backends configured for launch, unable to function");
+  }
 
+  vector<unique_ptr<DNSBackend>> ret;
   ret.reserve(d_instances.size());
 
   std::string current; // to make the exception text more useful
@@ -193,35 +195,23 @@ vector<DNSBackend *> BackendMakerClass::all(bool metadataOnly)
   try {
     for (const auto& instance : d_instances) {
       current = instance.first + instance.second;
-      DNSBackend *made = nullptr;
-
-      if (metadataOnly) {
-        made = d_repository[instance.first]->makeMetadataOnly(instance.second);
-      }
-      else {
-        made = d_repository[instance.first]->make(instance.second);
-      }
-
-      if (!made) {
+      auto* repo = d_repository[instance.first];
+      std::unique_ptr<DNSBackend> made{metadataOnly ? repo->makeMetadataOnly(instance.second) : repo->make(instance.second)};
+      if (made == nullptr) {
         throw PDNSException("Unable to launch backend '" + instance.first + "'");
       }
-
-      ret.push_back(made);
+      ret.push_back(std::move(made));
     }
   }
   catch(const PDNSException &ae) {
-    g_log<<Logger::Error<<"Caught an exception instantiating a backend (" << current << "): "<<ae.reason<<endl;
-    g_log<<Logger::Error<<"Cleaning up"<<endl;
-    for (auto i : ret) {
-      delete i;
-    }
+    g_log << Logger::Error << "Caught an exception instantiating a backend (" << current << "): " << ae.reason << endl;
+    g_log << Logger::Error << "Cleaning up" << endl;
+    ret.clear();
     throw;
   } catch(...) {
     // and cleanup
-    g_log<<Logger::Error<<"Caught an exception instantiating a backend (" << current <<"), cleaning up"<<endl;
-    for (auto i : ret) {
-      delete i;
-    }
+    g_log << Logger::Error << "Caught an exception instantiating a backend (" << current << "), cleaning up" << endl;
+    ret.clear();
     throw;
   }
 
index c1fc959c7bba9d2b19641b373d1dc6108460d8b0..1e346a16ebd7b0242afd7ae1bcb73552cd6720cb 100644 (file)
@@ -496,7 +496,7 @@ class BackendMakerClass
 public:
   void report(BackendFactory *bf);
   void launch(const string &instr);
-  vector<DNSBackend *> all(bool skipBIND=false);
+  vector<std::unique_ptr<DNSBackend>> all(bool metadataOnly=false);
   void load(const string &module);
   [[nodiscard]] size_t numLauncheable() const;
   vector<string> getModules();
index 4b7687da1ff4efd96222cdf29ddac7d73a4f22b3..cbec56b17e93f9c0af2fbb7e856ca6fa40e55370 100644 (file)
@@ -1,4 +1,5 @@
 
+#include <boost/smart_ptr/make_shared_array.hpp>
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
@@ -2361,7 +2362,7 @@ static int testSchema(DNSSECKeeper& dk, const DNSName& zone)
   cout<<"Constructing UeberBackend"<<endl;
   UeberBackend B("default");
   cout<<"Picking first backend - if this is not what you want, edit launch line!"<<endl;
-  DNSBackend *db = B.backends[0];
+  DNSBackend *db = B.backends[0].get();
   cout << "Creating secondary zone " << zone << endl;
   db->createSlaveDomain("127.0.0.1", zone, "", "_testschema");
   cout << "Secondary zone created" << endl;
@@ -2505,6 +2506,7 @@ static int addOrSetMeta(const DNSName& zone, const string& kind, const vector<st
   return 0;
 }
 
+// NOLINTNEXTLINE(readability-function-cognitive-complexity): TODO Clean this function up.
 int main(int argc, char** argv)
 try
 {
@@ -4080,19 +4082,27 @@ try
   }
   else if (cmds.at(0) == "b2b-migrate") {
     if (cmds.size() < 3) {
-      cerr<<"Usage: b2b-migrate OLD NEW"<<endl;
+      cerr << "Usage: b2b-migrate OLD NEW" << endl;
       return 1;
     }
 
-    DNSBackend *src = nullptr;
-    DNSBackend *tgt = nullptr;
+    if (cmds.at(1) == cmds.at(2)) {
+      cerr << "Error: b2b-migrate OLD NEW: OLD cannot be the same as NEW" << endl;
+      return 1;
+    }
 
-    for(DNSBackend *b : BackendMakers().all()) {
-      if (b->getPrefix() == cmds.at(1))
-        src = b;
-      if (b->getPrefix() == cmds.at(2))
-        tgt = b;
+    unique_ptr<DNSBackend> src{nullptr};
+    unique_ptr<DNSBackend> tgt{nullptr};
+
+    for (auto& backend : BackendMakers().all()) {
+      if (backend->getPrefix() == cmds.at(1)) {
+         src = std::move(backend);
+      }
+      else if (backend->getPrefix() == cmds.at(2)) {
+         tgt = std::move(backend);
+      }
     }
+
     if (src == nullptr) {
       cerr << "Unknown source backend '" << cmds.at(1) << "'" << endl;
       return 1;
@@ -4190,21 +4200,22 @@ try
       return 1;
     }
 
-    DNSBackend *db = nullptr;
+    std::unique_ptr<DNSBackend> matchingBackend{nullptr};
 
-    for(DNSBackend *b : BackendMakers().all()) {
-      if (b->getPrefix() == cmds.at(1))
-        db = b;
+    for (auto& backend : BackendMakers().all()) {
+      if (backend->getPrefix() == cmds.at(1)) {
+        matchingBackend = std::move(backend);
+      }
     }
 
-    if (db == nullptr) {
+    if (matchingBackend == nullptr) {
       cerr << "Unknown backend '" << cmds.at(1) << "'" << endl;
       return 1;
     }
 
-    for(auto i=next(begin(cmds),2); i != end(cmds); ++i) {
-      cerr<<"== "<<*i<<endl;
-      cout<<db->directBackendCmd(*i);
+    for (auto i = next(begin(cmds), 2); i != end(cmds); ++i) {
+      cerr << "== " << *i << endl;
+      cout << matchingBackend->directBackendCmd(*i);
     }
 
     return 0;
index 4a13aafad05004df111b5ea42c6b41fb43d5a5c2..1bde35389a100eb20573dc6fd93f9aba9283e222 100644 (file)
@@ -1053,8 +1053,10 @@ BOOST_AUTO_TEST_CASE(test_multi_backends_best_soa) {
 
     auto testFunction = [](UeberBackend& ub) -> void {
     {
-      auto sbba = dynamic_cast<SimpleBackendBestAuth*>(ub.backends.at(0));
+      auto* sbba = dynamic_cast<SimpleBackendBestAuth*>(ub.backends.at(0).get());
       BOOST_REQUIRE(sbba != nullptr);
+
+      // NOLINTNEXTLINE (clang-analyzer-core.NullDereference): Not sure.
       sbba->d_authLookupCount = 0;
 
       // test getAuth()
index 5ba73e7724d403e9c0f93e73445eba65e28a8e40..3db6d3971d083ac7831ed341e038779668f53150 100644 (file)
@@ -19,6 +19,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
+#include <memory>
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
@@ -121,7 +122,7 @@ void UeberBackend::go()
 
 bool UeberBackend::getDomainInfo(const DNSName& domain, DomainInfo& domainInfo, bool getSerial)
 {
-  for (auto* backend : backends) {
+  for (auto& backend : backends) {
     if (backend->getDomainInfo(domain, domainInfo, getSerial)) {
       return true;
     }
@@ -131,8 +132,8 @@ bool UeberBackend::getDomainInfo(const DNSName& domain, DomainInfo& domainInfo,
 
 bool UeberBackend::createDomain(const DNSName& domain, const DomainInfo::DomainKind kind, const vector<ComboAddress>& masters, const string& account)
 {
-  for (DNSBackend* mydb : backends) {
-    if (mydb->createDomain(domain, kind, masters, account)) {
+  for (auto& backend : backends) {
+    if (backend->createDomain(domain, kind, masters, account)) {
       return true;
     }
   }
@@ -141,7 +142,7 @@ bool UeberBackend::createDomain(const DNSName& domain, const DomainInfo::DomainK
 
 bool UeberBackend::doesDNSSEC()
 {
-  for (auto* backend : backends) {
+  for (auto& backend : backends) {
     if (backend->doesDNSSEC()) {
       return true;
     }
@@ -152,7 +153,7 @@ bool UeberBackend::doesDNSSEC()
 bool UeberBackend::addDomainKey(const DNSName& name, const DNSBackend::KeyData& key, int64_t& keyID)
 {
   keyID = -1;
-  for (DNSBackend* backend : backends) {
+  for (auto& backend : backends) {
     if (backend->addDomainKey(name, key, keyID)) {
       return true;
     }
@@ -161,7 +162,7 @@ bool UeberBackend::addDomainKey(const DNSName& name, const DNSBackend::KeyData&
 }
 bool UeberBackend::getDomainKeys(const DNSName& name, std::vector<DNSBackend::KeyData>& keys)
 {
-  for (DNSBackend* backend : backends) {
+  for (auto& backend : backends) {
     if (backend->getDomainKeys(name, keys)) {
       return true;
     }
@@ -171,7 +172,7 @@ bool UeberBackend::getDomainKeys(const DNSName& name, std::vector<DNSBackend::Ke
 
 bool UeberBackend::getAllDomainMetadata(const DNSName& name, std::map<std::string, std::vector<std::string>>& meta)
 {
-  for (DNSBackend* backend : backends) {
+  for (auto& backend : backends) {
     if (backend->getAllDomainMetadata(name, meta)) {
       return true;
     }
@@ -181,7 +182,7 @@ bool UeberBackend::getAllDomainMetadata(const DNSName& name, std::map<std::strin
 
 bool UeberBackend::getDomainMetadata(const DNSName& name, const std::string& kind, std::vector<std::string>& meta)
 {
-  for (DNSBackend* backend : backends) {
+  for (auto& backend : backends) {
     if (backend->getDomainMetadata(name, kind, meta)) {
       return true;
     }
@@ -202,7 +203,7 @@ bool UeberBackend::getDomainMetadata(const DNSName& name, const std::string& kin
 
 bool UeberBackend::setDomainMetadata(const DNSName& name, const std::string& kind, const std::vector<std::string>& meta)
 {
-  for (DNSBackend* backend : backends) {
+  for (auto& backend : backends) {
     if (backend->setDomainMetadata(name, kind, meta)) {
       return true;
     }
@@ -221,7 +222,7 @@ bool UeberBackend::setDomainMetadata(const DNSName& name, const std::string& kin
 
 bool UeberBackend::activateDomainKey(const DNSName& name, unsigned int keyID)
 {
-  for (DNSBackend* backend : backends) {
+  for (auto& backend : backends) {
     if (backend->activateDomainKey(name, keyID)) {
       return true;
     }
@@ -231,7 +232,7 @@ bool UeberBackend::activateDomainKey(const DNSName& name, unsigned int keyID)
 
 bool UeberBackend::deactivateDomainKey(const DNSName& name, unsigned int keyID)
 {
-  for (DNSBackend* backend : backends) {
+  for (auto& backend : backends) {
     if (backend->deactivateDomainKey(name, keyID)) {
       return true;
     }
@@ -241,7 +242,7 @@ bool UeberBackend::deactivateDomainKey(const DNSName& name, unsigned int keyID)
 
 bool UeberBackend::publishDomainKey(const DNSName& name, unsigned int keyID)
 {
-  for (DNSBackend* backend : backends) {
+  for (auto& backend : backends) {
     if (backend->publishDomainKey(name, keyID)) {
       return true;
     }
@@ -251,7 +252,7 @@ bool UeberBackend::publishDomainKey(const DNSName& name, unsigned int keyID)
 
 bool UeberBackend::unpublishDomainKey(const DNSName& name, unsigned int keyID)
 {
-  for (DNSBackend* backend : backends) {
+  for (auto& backend : backends) {
     if (backend->unpublishDomainKey(name, keyID)) {
       return true;
     }
@@ -261,7 +262,7 @@ bool UeberBackend::unpublishDomainKey(const DNSName& name, unsigned int keyID)
 
 bool UeberBackend::removeDomainKey(const DNSName& name, unsigned int keyID)
 {
-  for (DNSBackend* backend : backends) {
+  for (auto& backend : backends) {
     if (backend->removeDomainKey(name, keyID)) {
       return true;
     }
@@ -324,7 +325,7 @@ void UeberBackend::getUpdatedMasters(vector<DomainInfo>& domains, std::unordered
 
 bool UeberBackend::inTransaction()
 {
-  for (auto* backend : backends) {
+  for (auto& backend : backends) {
     if (backend->inTransaction()) {
       return true;
     }
@@ -363,7 +364,7 @@ bool UeberBackend::fillSOAFromZoneRecord(DNSName& shorter, const int zoneId, SOA
     return false;
   }
 
-  soaData->db = backends.size() == 1 ? *backends.begin() : nullptr;
+  soaData->db = backends.size() == 1 ? backends.begin()->get() : nullptr;
 
   // Leave database handle in a consistent state.
   while (get(zoneRecord)) {
@@ -381,7 +382,7 @@ UeberBackend::CacheResult UeberBackend::fillSOAFromCache(SOAData* soaData, DNSNa
     DLOG(g_log << Logger::Error << "has pos cache entry: " << shorter << endl);
     fillSOAData(d_answers[0], *soaData);
 
-    soaData->db = backends.size() == 1 ? *backends.begin() : nullptr;
+    soaData->db = backends.size() == 1 ? backends.begin()->get() : nullptr;
     soaData->qname = shorter;
   }
   else if (cacheResult == CacheResult::NegativeMatch && d_negcache_ttl != 0U) {
@@ -391,7 +392,7 @@ UeberBackend::CacheResult UeberBackend::fillSOAFromCache(SOAData* soaData, DNSNa
   return cacheResult;
 }
 
-static std::vector<DNSBackend*>::iterator findBestMatchingBackend(std::vector<DNSBackend*>& backends, std::vector<std::pair<std::size_t, SOAData>>& bestMatches, const DNSName& shorter, SOAData* soaData)
+static std::vector<std::unique_ptr<DNSBackend>>::iterator findBestMatchingBackend(std::vector<std::unique_ptr<DNSBackend>>& backends, std::vector<std::pair<std::size_t, SOAData>>& bestMatches, const DNSName& shorter, SOAData* soaData)
 {
   auto backend = backends.begin();
   for (auto bestMatch = bestMatches.begin(); backend != backends.end() && bestMatch != bestMatches.end(); ++backend, ++bestMatch) {
@@ -552,7 +553,7 @@ bool UeberBackend::getSOAUncached(const DNSName& domain, SOAData& soaData)
   d_question.qname = domain;
   d_question.zoneId = -1;
 
-  for (auto* backend : backends) {
+  for (auto& backend : backends) {
     if (backend->getSOA(domain, soaData)) {
       if (domain != soaData.qname) {
         throw PDNSException("getSOA() returned an SOA for the wrong zone. Question: '" + domain.toLogString() + "', answer: '" + soaData.qname.toLogString() + "'");
@@ -579,7 +580,7 @@ bool UeberBackend::getSOAUncached(const DNSName& domain, SOAData& soaData)
 
 bool UeberBackend::superMasterAdd(const AutoPrimary& primary)
 {
-  for (auto* backend : backends) {
+  for (auto& backend : backends) {
     if (backend->superMasterAdd(primary)) {
       return true;
     }
@@ -589,7 +590,7 @@ bool UeberBackend::superMasterAdd(const AutoPrimary& primary)
 
 bool UeberBackend::autoPrimaryRemove(const AutoPrimary& primary)
 {
-  for (auto* backend : backends) {
+  for (auto& backend : backends) {
     if (backend->autoPrimaryRemove(primary)) {
       return true;
     }
@@ -599,7 +600,7 @@ bool UeberBackend::autoPrimaryRemove(const AutoPrimary& primary)
 
 bool UeberBackend::autoPrimariesList(std::vector<AutoPrimary>& primaries)
 {
-  for (auto* backend : backends) {
+  for (auto& backend : backends) {
     if (backend->autoPrimariesList(primaries)) {
       return true;
     }
@@ -609,7 +610,7 @@ bool UeberBackend::autoPrimariesList(std::vector<AutoPrimary>& primaries)
 
 bool UeberBackend::superMasterBackend(const string& ip, const DNSName& domain, const vector<DNSResourceRecord>& nsset, string* nameserver, string* account, DNSBackend** dnsBackend)
 {
-  for (auto* backend : backends) {
+  for (auto& backend : backends) {
     if (backend->superMasterBackend(ip, domain, nsset, nameserver, account, dnsBackend)) {
       return true;
     }
@@ -629,22 +630,6 @@ UeberBackend::UeberBackend(const string& pname)
   backends = BackendMakers().all(pname == "key-only");
 }
 
-static void del(DNSBackend* backend)
-{
-  delete backend;
-}
-
-void UeberBackend::cleanup()
-{
-  {
-    auto instances = d_instances.lock();
-    remove(instances->begin(), instances->end(), this);
-    instances->resize(instances->size() - 1);
-  }
-
-  for_each(backends.begin(), backends.end(), del);
-}
-
 // returns -1 for miss, 0 for negative match, 1 for hit
 enum UeberBackend::CacheResult UeberBackend::cacheHas(const Question& question, vector<DNSZoneRecord>& resourceRecords) const
 {
@@ -705,7 +690,14 @@ void UeberBackend::alsoNotifies(const DNSName& domain, set<string>* ips)
 UeberBackend::~UeberBackend()
 {
   DLOG(g_log << Logger::Error << "UeberBackend destructor called, removing ourselves from instances, and deleting our backends" << endl);
-  cleanup();
+
+  {
+    auto instances = d_instances.lock();
+    [[maybe_unused]] auto end = remove(instances->begin(), instances->end(), this);
+    instances->resize(instances->size() - 1);
+  }
+
+  backends.clear();
 }
 
 // this handle is more magic than most
@@ -747,7 +739,7 @@ void UeberBackend::lookup(const QType& qtype, const DNSName& qname, int zoneId,
     //      cout<<"UeberBackend::lookup("<<qname<<"|"<<DNSRecordContent::NumberToType(qtype.getCode())<<"): uncached"<<endl;
     d_negcached = d_cached = false;
     d_answers.clear();
-    (d_handle.d_hinterBackend = backends[d_handle.i++])->lookup(d_handle.qtype, d_handle.qname, d_handle.zoneId, d_handle.pkt_p);
+    (d_handle.d_hinterBackend = backends[d_handle.i++].get())->lookup(d_handle.qtype, d_handle.qname, d_handle.zoneId, d_handle.pkt_p);
     ++(*s_backendQueries);
   }
   else if (cacheResult == CacheResult::NegativeMatch) {
@@ -815,7 +807,7 @@ bool UeberBackend::get(DNSZoneRecord& resourceRecord)
 //
 bool UeberBackend::setTSIGKey(const DNSName& name, const DNSName& algorithm, const string& content)
 {
-  for (auto* backend : backends) {
+  for (auto& backend : backends) {
     if (backend->setTSIGKey(name, algorithm, content)) {
       return true;
     }
@@ -828,7 +820,7 @@ bool UeberBackend::getTSIGKey(const DNSName& name, DNSName& algorithm, string& c
   algorithm.clear();
   content.clear();
 
-  for (auto* backend : backends) {
+  for (auto& backend : backends) {
     if (backend->getTSIGKey(name, algorithm, content)) {
       break;
     }
@@ -840,7 +832,7 @@ bool UeberBackend::getTSIGKeys(std::vector<struct TSIGKey>& keys)
 {
   keys.clear();
 
-  for (auto* backend : backends) {
+  for (auto& backend : backends) {
     if (backend->getTSIGKeys(keys)) {
       return true;
     }
@@ -850,7 +842,7 @@ bool UeberBackend::getTSIGKeys(std::vector<struct TSIGKey>& keys)
 
 bool UeberBackend::deleteTSIGKey(const DNSName& name)
 {
-  for (auto* backend : backends) {
+  for (auto& backend : backends) {
     if (backend->deleteTSIGKey(name)) {
       return true;
     }
@@ -904,7 +896,7 @@ bool UeberBackend::handle::get(DNSZoneRecord& record)
       DLOG(g_log << "Backend #" << i << " of " << parent->backends.size()
                  << " out of answers, taking next" << endl);
 
-      d_hinterBackend = parent->backends[i++];
+      d_hinterBackend = parent->backends[i++].get();
       d_hinterBackend->lookup(qtype, qname, zoneId, pkt_p);
       ++(*s_backendQueries);
     }
index 07c24310b74e0686f6f7a3a58f372a7cf4c92523..d6a0323e2a6762f66a4fea5a72ff62975c557d2c 100644 (file)
@@ -65,9 +65,7 @@ public:
 
   /** This contains all registered backends. The DynListener modifies this list for us when
       new modules are loaded */
-  vector<DNSBackend*> backends;
-
-  void cleanup();
+  vector<std::unique_ptr<DNSBackend>> backends;
 
   //! the very magic handle for UeberBackend questions
   class handle