]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
auth: Don't leak a CDB object in case of bogus data 5105/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 3 Mar 2017 14:09:10 +0000 (15:09 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 3 Mar 2017 14:09:10 +0000 (15:09 +0100)
modules/tinydnsbackend/tinydnsbackend.cc
modules/tinydnsbackend/tinydnsbackend.hh

index a20ffc441dd072748025ae4ae8f1b4042b038f20..8b3bed9f89e39d7abc104aca81fbf5be6e2e9f59 100644 (file)
@@ -153,7 +153,7 @@ void TinyDNSBackend::getAllDomains(vector<DomainInfo> *domains, bool include_dis
   d_isAxfr=true;
   d_dnspacket = NULL;
 
-  d_cdbReader=new CDB(getArg("dbfile"));
+  d_cdbReader=std::unique_ptr<CDB>(new CDB(getArg("dbfile")));
   d_cdbReader->searchAll();
   DNSResourceRecord rr;
 
@@ -178,7 +178,7 @@ void TinyDNSBackend::getAllDomains(vector<DomainInfo> *domains, bool include_dis
 bool TinyDNSBackend::list(const DNSName &target, int domain_id, bool include_disabled) {
   d_isAxfr=true;
   string key = target.toDNSString(); // FIXME400 bug: no lowercase here? or promise that from core?
-  d_cdbReader=new CDB(getArg("dbfile"));
+  d_cdbReader=std::unique_ptr<CDB>(new CDB(getArg("dbfile")));
   return d_cdbReader->searchSuffix(key);
 }
 
@@ -199,7 +199,7 @@ void TinyDNSBackend::lookup(const QType &qtype, const DNSName &qdomain, DNSPacke
 
   d_qtype=qtype;
 
-  d_cdbReader=new CDB(getArg("dbfile"));
+  d_cdbReader=std::unique_ptr<CDB>(new CDB(getArg("dbfile")));
   d_cdbReader->searchKey(key);
   d_dnspacket = pkt_p;
 }
@@ -318,7 +318,7 @@ bool TinyDNSBackend::get(DNSResourceRecord &rr)
   } // end of while
   DLOG(L<<Logger::Debug<<backendname<<"No more records to return."<<endl);
 
-  delete d_cdbReader;
+  d_cdbReader = nullptr;
   return false;
 }
 
index a30e0385390735ac80f3b826caf7b3dee5120476..56f7add24d16b331e3f1f7b75158bd745666491d 100644 (file)
@@ -96,7 +96,7 @@ private:
   //data member variables
   uint64_t d_taiepoch;
   QType d_qtype;
-  CDB *d_cdbReader;
+  std::unique_ptr<CDB> d_cdbReader;
   DNSPacket *d_dnspacket; // used for location and edns-client support.
   bool d_isWildcardQuery; // Indicate if the query received was a wildcard query.
   bool d_isAxfr; // Indicate if we received a list() and not a lookup().