diff --git a/modules/bindbackend/bindbackend2.hh b/modules/bindbackend/bindbackend2.hh index c3998394f1db..7dc8036b43cf 100644 --- a/modules/bindbackend/bindbackend2.hh +++ b/modules/bindbackend/bindbackend2.hh @@ -249,7 +249,6 @@ private: void setupDNSSEC(); void setupStatements(); void freeStatements(); - void release(SSqlStatement**); static bool safeGetBBDomainInfo(int id, BB2DomainInfo* bbd); static void safePutBBDomainInfo(const BB2DomainInfo& bbd); static bool safeGetBBDomainInfo(const DNSName& name, BB2DomainInfo* bbd); diff --git a/modules/bindbackend/binddnssec.cc b/modules/bindbackend/binddnssec.cc index 93996982e965..5df886d56e77 100644 --- a/modules/bindbackend/binddnssec.cc +++ b/modules/bindbackend/binddnssec.cc @@ -125,11 +125,6 @@ void Bind2Backend::setupStatements() d_getTSIGKeysQuery_stmt = d_dnssecdb->prepare("select name,algorithm,secret from tsigkeys", 0); } -void Bind2Backend::release(SSqlStatement** stmt) { - delete *stmt; - *stmt = NULL; -} - void Bind2Backend::freeStatements() { d_getAllDomainMetadataQuery_stmt.reset(); diff --git a/modules/gpgsqlbackend/gpgsqlbackend.cc b/modules/gpgsqlbackend/gpgsqlbackend.cc index cc1c601de87d..b909b98cb56e 100644 --- a/modules/gpgsqlbackend/gpgsqlbackend.cc +++ b/modules/gpgsqlbackend/gpgsqlbackend.cc @@ -67,7 +67,7 @@ void gPgSQLBackend::reconnect() bool gPgSQLBackend::inTransaction() { - const auto* db = dynamic_cast(d_db); + const auto* db = dynamic_cast(d_db.get()); if (db) { return db->in_trx(); } diff --git a/modules/pipebackend/pipebackend.cc b/modules/pipebackend/pipebackend.cc index 1227b27d121b..103d39e1f1a6 100644 --- a/modules/pipebackend/pipebackend.cc +++ b/modules/pipebackend/pipebackend.cc @@ -46,7 +46,6 @@ static const char *kBackendId = "[PIPEBackend]"; CoWrapper::CoWrapper(const string &command, int timeout, int abiVersion) { - d_cp=0; d_command=command; d_timeout=timeout; d_abiVersion = abiVersion; @@ -56,11 +55,8 @@ CoWrapper::CoWrapper(const string &command, int timeout, int abiVersion) CoWrapper::~CoWrapper() { - if(d_cp) - delete d_cp; } - void CoWrapper::launch() { if(d_cp) @@ -70,12 +66,12 @@ void CoWrapper::launch() throw ArgException("pipe-command is not specified"); if(isUnixSocket(d_command)) { - d_cp = new UnixRemote(d_command, d_timeout); + d_cp = std::unique_ptr(new UnixRemote(d_command, d_timeout)); } else { - auto coprocess = new CoProcess(d_command, d_timeout); + auto coprocess = std::unique_ptr(new CoProcess(d_command, d_timeout)); coprocess->launch(); - d_cp = coprocess; + d_cp = std::move(coprocess); } d_cp->send("HELO\t"+std::to_string(d_abiVersion)); @@ -92,8 +88,7 @@ void CoWrapper::send(const string &line) return; } catch(PDNSException &ae) { - delete d_cp; - d_cp=0; + d_cp.reset(); throw; } } @@ -106,8 +101,7 @@ void CoWrapper::receive(string &line) } catch(PDNSException &ae) { g_log<(new Regex(getArg("regex"))); + } d_regexstr=getArg("regex"); d_abiVersion = getArgAsNum("abi-version"); d_coproc=unique_ptr (new CoWrapper(getArg("command"), getArgAsNum("timeout"), getArgAsNum("abi-version"))); @@ -154,7 +149,7 @@ void PipeBackend::launch() void PipeBackend::cleanup() { d_coproc.reset(0); - delete d_regex; + d_regex.reset(); d_regexstr = string(); d_abiVersion = 0; } diff --git a/modules/pipebackend/pipebackend.hh b/modules/pipebackend/pipebackend.hh index eba89b201be3..bdb00b0a45c0 100644 --- a/modules/pipebackend/pipebackend.hh +++ b/modules/pipebackend/pipebackend.hh @@ -41,7 +41,7 @@ public: void send(const string &line); void receive(string &line); private: - CoRemote* d_cp; + std::unique_ptr d_cp; string d_command; void launch(); int d_timeout; @@ -62,10 +62,10 @@ public: private: void launch(); void cleanup(); - unique_ptr d_coproc; + std::unique_ptr d_coproc; + std::unique_ptr d_regex; DNSName d_qname; QType d_qtype; - Regex* d_regex; string d_regexstr; bool d_disavow; int d_abiVersion; diff --git a/pdns/auth-carbon.cc b/pdns/auth-carbon.cc index 4d0cfcb78269..09f776aa7c94 100644 --- a/pdns/auth-carbon.cc +++ b/pdns/auth-carbon.cc @@ -32,7 +32,7 @@ #include "namespaces.hh" -void* carbonDumpThread(void*) +void carbonDumpThread() try { setThreadName("pdns/carbonDump"); @@ -85,20 +85,16 @@ try } sleep(arg().asNum("carbon-interval")); } - return 0; } catch(std::exception& e) { g_log<getString()); - p->setHash(hash); + uint32_t hash = canHashPacket(p.getString()); + p.setHash(hash); string value; bool haveSomething; time_t now = time(nullptr); - auto& mc = getMap(p->qdomain); + auto& mc = getMap(p.qdomain); { TryReadLock rl(&mc.d_mut); if(!rl.gotIt()) { @@ -85,7 +85,7 @@ bool AuthPacketCache::get(DNSPacket *p, DNSPacket *cached) return false; } - haveSomething = getEntryLocked(mc.d_map, p->getString(), hash, p->qdomain, p->qtype.getCode(), p->d_tcp, now, value); + haveSomething = getEntryLocked(mc.d_map, p.getString(), hash, p.qdomain, p.qtype.getCode(), p.d_tcp, now, value); } if (!haveSomething) { @@ -93,14 +93,14 @@ bool AuthPacketCache::get(DNSPacket *p, DNSPacket *cached) return false; } - if(cached->noparse(value.c_str(), value.size()) < 0) { + if(cached.noparse(value.c_str(), value.size()) < 0) { return false; } (*d_statnumhit)++; - cached->spoofQuestion(p); // for correct case - cached->qdomain = p->qdomain; - cached->qtype = p->qtype; + cached.spoofQuestion(p); // for correct case + cached.qdomain = p.qdomain; + cached.qtype = p.qtype; return true; } @@ -110,7 +110,7 @@ bool AuthPacketCache::entryMatches(cmap_t::index::type::iterator& iter, return iter->tcp == tcp && iter->qtype == qtype && iter->qname == qname && queryMatches(iter->query, query, qname); } -void AuthPacketCache::insert(DNSPacket *q, DNSPacket *r, unsigned int maxTTL) +void AuthPacketCache::insert(DNSPacket& q, DNSPacket& r, unsigned int maxTTL) { if(!d_ttl) { return; @@ -118,11 +118,11 @@ void AuthPacketCache::insert(DNSPacket *q, DNSPacket *r, unsigned int maxTTL) cleanupIfNeeded(); - if (ntohs(q->d.qdcount) != 1) { + if (ntohs(q.d.qdcount) != 1) { return; // do not try to cache packets with multiple questions } - if (q->qclass != QClass::IN) // we only cache the INternet + if (q.qclass != QClass::IN) // we only cache the INternet return; uint32_t ourttl = std::min(d_ttl, maxTTL); @@ -130,17 +130,17 @@ void AuthPacketCache::insert(DNSPacket *q, DNSPacket *r, unsigned int maxTTL) return; } - uint32_t hash = q->getHash(); + uint32_t hash = q.getHash(); time_t now = time(nullptr); CacheEntry entry; entry.hash = hash; entry.created = now; entry.ttd = now + ourttl; - entry.qname = q->qdomain; - entry.qtype = q->qtype.getCode(); - entry.value = r->getString(); - entry.tcp = r->d_tcp; - entry.query = q->getString(); + entry.qname = q.qdomain; + entry.qtype = q.qtype.getCode(); + entry.value = r.getString(); + entry.tcp = r.d_tcp; + entry.query = q.getString(); auto& mc = getMap(entry.qname); { diff --git a/pdns/auth-packetcache.hh b/pdns/auth-packetcache.hh index 157ad34ad89c..94dad631df41 100644 --- a/pdns/auth-packetcache.hh +++ b/pdns/auth-packetcache.hh @@ -52,9 +52,9 @@ public: AuthPacketCache(size_t mapsCount=1024); ~AuthPacketCache(); - void insert(DNSPacket *q, DNSPacket *r, uint32_t maxTTL); //!< We copy the contents of *p into our cache. Do not needlessly call this to insert questions already in the cache as it wastes resources + void insert(DNSPacket& q, DNSPacket& r, uint32_t maxTTL); //!< We copy the contents of *p into our cache. Do not needlessly call this to insert questions already in the cache as it wastes resources - bool get(DNSPacket *p, DNSPacket *q); //!< We return a dynamically allocated copy out of our cache. You need to delete it. You also need to spoof in the right ID with the DNSPacket.spoofID() method. + bool get(DNSPacket& p, DNSPacket& q); //!< You need to spoof in the right ID with the DNSPacket.spoofID() method. void cleanup(); //!< force the cache to preen itself from expired packets uint64_t purge(); diff --git a/pdns/backends/gsql/gsqlbackend.hh b/pdns/backends/gsql/gsqlbackend.hh index c9ac5b9e5362..656b099c0ce4 100644 --- a/pdns/backends/gsql/gsqlbackend.hh +++ b/pdns/backends/gsql/gsqlbackend.hh @@ -41,15 +41,13 @@ public: virtual ~GSQLBackend() { freeStatements(); - if(d_db) - delete d_db; + d_db.reset(); } void setDB(SSql *db) { freeStatements(); - delete d_db; - d_db=db; + d_db=std::unique_ptr(db); if (d_db) { d_db->setLog(::arg().mustDo("query-logging")); allocateStatements(); @@ -399,7 +397,7 @@ private: unique_ptr d_SearchCommentsQuery_stmt; protected: - SSql *d_db{nullptr}; + std::unique_ptr d_db{nullptr}; bool d_dnssecQueries; bool d_inTransaction{false}; }; diff --git a/pdns/calidns.cc b/pdns/calidns.cc index 559e795eb4a4..98a471863ab6 100644 --- a/pdns/calidns.cc +++ b/pdns/calidns.cc @@ -55,7 +55,7 @@ static po::variables_map g_vm; static bool g_quiet; -static void* recvThread(const vector* sockets) +static void* recvThread(const vector>* sockets) { vector rfds, fds; for(const auto& s : *sockets) { @@ -170,7 +170,7 @@ static void replaceEDNSClientSubnet(vector* packet, const Netmask& ecsR memcpy(&packet->at(packetSize - sizeof(addr)), &addr, sizeof(addr)); } -static void sendPackets(const vector* sockets, const vector* >& packets, int qps, ComboAddress dest, const Netmask& ecsRange) +static void sendPackets(const vector>& sockets, const vector* >& packets, int qps, ComboAddress dest, const Netmask& ecsRange) { unsigned int burst=100; const auto nsecPerBurst=1*(unsigned long)(burst*1000000000.0/qps); @@ -200,7 +200,7 @@ static void sendPackets(const vector* sockets, const vectorsize(), &dest); - if((ret=sendmsg((*sockets)[count % sockets->size()]->getHandle(), + if((ret=sendmsg(sockets[count % sockets.size()]->getHandle(), &u.msgh, 0))) if(ret < 0) unixDie("sendmsg"); @@ -413,7 +413,7 @@ try cout<<"Generated "< sockets; + vector> sockets; ComboAddress dest; try { dest = ComboAddress(g_vm["destination"].as(), 53); @@ -423,11 +423,11 @@ try return EXIT_FAILURE; } for(int i=0; i < 24; ++i) { - Socket *sock = new Socket(dest.sin4.sin_family, SOCK_DGRAM); + auto sock = make_unique(dest.sin4.sin_family, SOCK_DGRAM); // sock->connect(dest); setSocketSendBuffer(sock->getHandle(), 2000000); setSocketReceiveBuffer(sock->getHandle(), 2000000); - sockets.push_back(sock); + sockets.push_back(std::move(sock)); } new thread(recvThread, &sockets); uint32_t qps; @@ -479,7 +479,7 @@ try DTime dt; dt.set(); - sendPackets(&sockets, toSend, qps, dest, ecsRange); + sendPackets(sockets, toSend, qps, dest, ecsRange); const auto udiff = dt.udiffNoReset(); const auto realqps=toSend.size()/(udiff/1000000.0); diff --git a/pdns/common_startup.cc b/pdns/common_startup.cc index 0a4351cc6482..bce6b27ef67b 100644 --- a/pdns/common_startup.cc +++ b/pdns/common_startup.cc @@ -32,6 +32,8 @@ #include "threadname.hh" #include "misc.hh" +#include + #ifdef HAVE_SYSTEMD #include #endif @@ -48,8 +50,8 @@ ArgvMap theArg; StatBag S; //!< Statistics are gathered across PDNS via the StatBag class S AuthPacketCache PC; //!< This is the main PacketCache, shared across all threads AuthQueryCache QC; -DNSProxy *DP; -DynListener *dl; +std::unique_ptr DP{nullptr}; +std::unique_ptr dl{nullptr}; CommunicatorClass Communicator; shared_ptr N; int avg_latency; @@ -257,7 +259,7 @@ static uint64_t getQCount(const std::string& str) try { int totcount=0; - for(DNSDistributor* d : g_distributors) { + for(const auto& d : g_distributors) { if(!d) continue; totcount += d->getQueueSize(); // this does locking and other things, so don't get smart @@ -363,28 +365,25 @@ int isGuarded(char **argv) return !!p; } -void sendout(DNSPacket* a) +static void sendout(std::unique_ptr& a) { if(!a) return; - N->send(a); + N->send(*a); int diff=a->d_dt.udiff(); avg_latency=(int)(0.999*avg_latency+0.001*diff); - delete a; } //! The qthread receives questions over the internet via the Nameserver class, and hands them to the Distributor for further processing -void *qthread(void *number) +static void qthread(unsigned int num) try { setThreadName("pdns/receiver"); - DNSPacket *P; - DNSDistributor *distributor = DNSDistributor::Create(::arg().asNum("distributor-threads", 1)); // the big dispatcher! - int num = (int)(unsigned long)number; - g_distributors[num] = distributor; + g_distributors[num] = DNSDistributor::Create(::arg().asNum("distributor-threads", 1)); + DNSDistributor* distributor = g_distributors[num]; // the big dispatcher! DNSPacket question(true); DNSPacket cached(false); @@ -404,7 +403,7 @@ try // If we have SO_REUSEPORT then create a new port for all receiver threads // other than the first one. - if( number != NULL && N->canReusePort() ) { + if(N->canReusePort() ) { NS = g_udpReceivers[num]; if (NS == nullptr) { NS = N; @@ -414,52 +413,52 @@ try } for(;;) { - if(!(P=NS->receive(&question, buffer))) { // receive a packet inline + if(!NS->receive(question, buffer)) { // receive a packet inline continue; // packet was broken, try again } numreceived++; - if(P->d_remote.getSocklen()==sizeof(sockaddr_in)) + if(question.d_remote.getSocklen()==sizeof(sockaddr_in)) numreceived4++; else numreceived6++; - if(P->d_dnssecOk) + if(question.d_dnssecOk) numreceiveddo++; - if(P->d.qr) + if(question.d.qr) continue; - S.ringAccount("queries", P->qdomain, P->qtype); - S.ringAccount("remotes",P->d_remote); + S.ringAccount("queries", question.qdomain, question.qtype); + S.ringAccount("remotes", question.d_remote); if(logDNSQueries) { string remote; - if(P->hasEDNSSubnet()) - remote = P->getRemote().toString() + "<-" + P->getRealRemote().toString(); + if(question.hasEDNSSubnet()) + remote = question.getRemote().toString() + "<-" + question.getRealRemote().toString(); else - remote = P->getRemote().toString(); - g_log << Logger::Notice<<"Remote "<< remote <<" wants '" << P->qdomain<<"|"<qtype.getName() << - "', do = " <d_dnssecOk <<", bufsize = "<< P->getMaxReplyLen(); - if(P->d_ednsRawPacketSizeLimit > 0 && P->getMaxReplyLen() != (unsigned int)P->d_ednsRawPacketSizeLimit) - g_log<<" ("<d_ednsRawPacketSizeLimit<<")"; + remote = question.getRemote().toString(); + g_log << Logger::Notice<<"Remote "<< remote <<" wants '" << question.qdomain<<"|"<d.opcode != Opcode::Notify && P->d.opcode != Opcode::Update) && P->couldBeCached()) { - bool haveSomething=PC.get(P, &cached); // does the PacketCache recognize this question? + if(PC.enabled() && (question.d.opcode != Opcode::Notify && question.d.opcode != Opcode::Update) && question.couldBeCached()) { + bool haveSomething=PC.get(question, cached); // does the PacketCache recognize this question? if (haveSomething) { if(logDNSQueries) g_log<<"packetcache HIT"<d_remote); // inlined - cached.setSocket(P->getSocket()); // inlined - cached.d_anyLocal = P->d_anyLocal; - cached.setMaxReplyLen(P->getMaxReplyLen()); - cached.d.rd=P->d.rd; // copy in recursion desired bit - cached.d.id=P->d.id; + cached.setRemote(&question.d_remote); // inlined + cached.setSocket(question.getSocket()); // inlined + cached.d_anyLocal = question.d_anyLocal; + cached.setMaxReplyLen(question.getMaxReplyLen()); + cached.d.rd=question.d.rd; // copy in recursion desired bit + cached.d.id=question.d.id; cached.commitD(); // commit d to the packet inlined - NS->send(&cached); // answer it then inlined - diff=P->d_dt.udiff(); + NS->send(cached); // answer it then inlined + diff=question.d_dt.udiff(); avg_latency=(int)(0.999*avg_latency+0.001*diff); // 'EWMA' continue; } @@ -476,13 +475,12 @@ try g_log<<"packetcache MISS"<question(P, &sendout); // otherwise, give to the distributor + distributor->question(question, &sendout); // otherwise, give to the distributor } catch(DistributorFatal& df) { // when this happens, we have leaked loads of memory. Bailing out time. _exit(1); } } - return 0; } catch(PDNSException& pe) { @@ -559,7 +557,7 @@ void mainthread() Utility::dropUserPrivs(newuid); if(::arg().mustDo("resolver")){ - DP=new DNSProxy(::arg()["resolver"]); + DP=std::unique_ptr(new DNSProxy(::arg()["resolver"])); DP->go(); } @@ -608,8 +606,6 @@ void mainthread() // NOW SAFE TO CREATE THREADS! dl->go(); - pthread_t qtid; - if(::arg().mustDo("webserver") || ::arg().mustDo("api")) webserver.go(); @@ -618,13 +614,14 @@ void mainthread() TN->go(); // tcp nameserver launch - // fork(); (this worked :-)) unsigned int max_rthreads= ::arg().asNum("receiver-threads", 1); g_distributors.resize(max_rthreads); - for(unsigned int n=0; n < max_rthreads; ++n) - pthread_create(&qtid,0,qthread, reinterpret_cast(n)); // receives packets + for(unsigned int n=0; n < max_rthreads; ++n) { + std::thread t(qthread, n); + t.detach(); + } - pthread_create(&qtid,0,carbonDumpThread, 0); // runs even w/o carbon, might change @ runtime + std::thread carbonThread(carbonDumpThread); // runs even w/o carbon, might change @ runtime #ifdef HAVE_SYSTEMD /* If we are here, notify systemd that we are ay-ok! This might have some diff --git a/pdns/common_startup.hh b/pdns/common_startup.hh index 70502d4fbd5c..d7c0869a8ba1 100644 --- a/pdns/common_startup.hh +++ b/pdns/common_startup.hh @@ -40,8 +40,8 @@ extern ArgvMap theArg; extern StatBag S; //!< Statistics are gathered across PDNS via the StatBag class S extern AuthPacketCache PC; //!< This is the main PacketCache, shared across all threads extern AuthQueryCache QC; -extern DNSProxy *DP; -extern DynListener *dl; +extern std::unique_ptr DP; +extern std::unique_ptr dl; extern CommunicatorClass Communicator; extern std::shared_ptr N; extern vector > g_udpReceivers; @@ -52,7 +52,7 @@ extern void declareArguments(); extern void declareStats(); extern void mainthread(); extern int isGuarded( char ** ); -void* carbonDumpThread(void*); +void carbonDumpThread(); extern bool g_anyToTcp; extern bool g_8bitDNS; #ifdef HAVE_LUA_RECORDS diff --git a/pdns/communicator.hh b/pdns/communicator.hh index 353a26801e47..2b3fe7507165 100644 --- a/pdns/communicator.hh +++ b/pdns/communicator.hh @@ -31,7 +31,6 @@ #include #include #include -#include using namespace boost::multi_index; #include @@ -169,7 +168,7 @@ public: bool justNotified(const DNSName &domain, const string &ip); void addSuckRequest(const DNSName &domain, const ComboAddress& master); void addSlaveCheckRequest(const DomainInfo& di, const ComboAddress& remote); - void addTrySuperMasterRequest(DNSPacket *p); + void addTrySuperMasterRequest(const DNSPacket& p); void notify(const DNSName &domain, const string &ip); void mainloop(); void retrievalLoopThread(); @@ -194,7 +193,7 @@ private: map,time_t>d_holes; pthread_mutex_t d_holelock; void suck(const DNSName &domain, const ComboAddress& remote); - void ixfrSuck(const DNSName &domain, const TSIGTriplet& tt, const ComboAddress& laddr, const ComboAddress& remote, boost::scoped_ptr& pdl, + void ixfrSuck(const DNSName &domain, const TSIGTriplet& tt, const ComboAddress& laddr, const ComboAddress& remote, std::unique_ptr& pdl, ZoneStatus& zs, vector* axfr); void slaveRefresh(PacketHandler *P); diff --git a/pdns/distributor.hh b/pdns/distributor.hh index f5b1e1e323c9..30d8f76507e1 100644 --- a/pdns/distributor.hh +++ b/pdns/distributor.hh @@ -51,11 +51,12 @@ extern StatBag S; template class Distributor { public: - static Distributor *Create(int n=1); //!< Create a new Distributor with \param n threads - typedef std::function callback_t; - virtual int question(Question *, callback_t callback) =0; //!< Submit a question to the Distributor + static Distributor* Create(int n=1); //!< Create a new Distributor with \param n threads + typedef std::function&)> callback_t; + virtual int question(Question&, callback_t callback) =0; //!< Submit a question to the Distributor virtual int getQueueSize() =0; //!< Returns length of question queue virtual bool isOverloaded() =0; + virtual ~Distributor() { cerr<<__func__< class SingleThreadDistributor @@ -65,8 +66,8 @@ public: SingleThreadDistributor(const SingleThreadDistributor&) = delete; void operator=(const SingleThreadDistributor&) = delete; SingleThreadDistributor(); - typedef std::function callback_t; - int question(Question *, callback_t callback) override; //!< Submit a question to the Distributor + typedef std::function&)> callback_t; + int question(Question&, callback_t callback) override; //!< Submit a question to the Distributor int getQueueSize() override { return 0; } @@ -76,11 +77,8 @@ public: return false; } - ~SingleThreadDistributor() { - if (b) delete b; - } private: - Backend *b{0}; + std::unique_ptr b{nullptr}; }; template class MultiThreadDistributor @@ -90,8 +88,8 @@ public: MultiThreadDistributor(const MultiThreadDistributor&) = delete; void operator=(const MultiThreadDistributor&) = delete; MultiThreadDistributor(int n); - typedef std::function callback_t; - int question(Question *, callback_t callback) override; //!< Submit a question to the Distributor + typedef std::function&)> callback_t; + int question(Question&, callback_t callback) override; //!< Submit a question to the Distributor static void* makeThread(void *); //!< helper function to create our n threads int getQueueSize() override { return d_queued; @@ -99,7 +97,11 @@ public: struct QuestionData { - Question *Q; + QuestionData(const Question& query): Q(query) + { + } + + Question Q; callback_t callback; int id; }; @@ -108,7 +110,7 @@ public: { return d_overloadQueueLength && (d_queued > d_overloadQueueLength); } - + private: int nextid; time_t d_last_started; @@ -119,19 +121,19 @@ private: }; //template::nextid; -templateDistributor* Distributor::Create(int n) +template Distributor* Distributor::Create(int n) { if( n == 1 ) - return new SingleThreadDistributor(); + return new SingleThreadDistributor(); else - return new MultiThreadDistributor( n ); + return new MultiThreadDistributor( n ); } templateSingleThreadDistributor::SingleThreadDistributor() { g_log<(); } catch(const PDNSException &AE) { g_log<void *MultiThreadDistributo int ournum=us->d_running++; try { - Backend *b=new Backend(); // this will answer our questions + std::unique_ptr b= make_unique(); // this will answer our questions int queuetimeout=::arg().asNum("queue-limit"); for(;;) { - QuestionData* QD; - if(read(us->d_pipes[ournum].first, &QD, sizeof(QD)) != sizeof(QD)) + QuestionData* tempQD = nullptr; + if(read(us->d_pipes[ournum].first, &tempQD, sizeof(tempQD)) != sizeof(tempQD)) unixDie("read"); --us->d_queued; - Answer *a = nullptr; + std::unique_ptr QD = std::unique_ptr(tempQD); + tempQD = nullptr; + std::unique_ptr a = nullptr; - if(queuetimeout && QD->Q->d_dt.udiff()>queuetimeout*1000) { - delete QD->Q; - delete QD; + if(queuetimeout && QD->Q.d_dt.udiff()>queuetimeout*1000) { S.inc("timedout-packets"); continue; } @@ -208,40 +210,33 @@ retry: try { if (!b) { allowRetry=false; - b=new Backend(); + b=make_unique(); } a=b->question(QD->Q); - delete QD->Q; } catch(const PDNSException &e) { - delete b; - b=NULL; + b.reset(); if (!allowRetry) { g_log<Q->replyPacket(); + a=QD->Q.replyPacket(); a->setRcode(RCode::ServFail); S.inc("servfail-packets"); - S.ringAccount("servfail-queries", QD->Q->qdomain, QD->Q->qtype); - - delete QD->Q; + S.ringAccount("servfail-queries", QD->Q.qdomain, QD->Q.qtype); } else { g_log<Q->replyPacket(); + a=QD->Q.replyPacket(); a->setRcode(RCode::ServFail); S.inc("servfail-packets"); - S.ringAccount("servfail-queries", QD->Q->qdomain, QD->Q->qtype); - - delete QD->Q; + S.ringAccount("servfail-queries", QD->Q.qdomain, QD->Q.qtype); } else { g_log<callback(a); - delete QD; + QD.reset(); } - delete b; + b.reset(); } catch(const PDNSException &AE) { g_log<int SingleThreadDistributor::question(Question* q, callback_t callback) +templateint SingleThreadDistributor::question(Question& q, callback_t callback) { - Answer *a = nullptr; + std::unique_ptr a = nullptr; bool allowRetry=true; retry: try { if (!b) { allowRetry=false; - b=new Backend; + b=make_unique(); } a=b->question(q); // a can be NULL! } catch(const PDNSException &e) { - delete b; - b=NULL; + b.reset(); if (!allowRetry) { g_log<replyPacket(); + a=q.replyPacket(); a->setRcode(RCode::ServFail); S.inc("servfail-packets"); - S.ringAccount("servfail-queries", q->qdomain, q->qtype); + S.ringAccount("servfail-queries", q.qdomain, q.qtype); } else { g_log<replyPacket(); + a=q.replyPacket(); a->setRcode(RCode::ServFail); S.inc("servfail-packets"); - S.ringAccount("servfail-queries", q->qdomain, q->qtype); + S.ringAccount("servfail-queries", q.qdomain, q.qtype); } else { g_log<int MultiThreadDistributor::question(Question* q, callback_t callback) +templateint MultiThreadDistributor::question(Question& q, callback_t callback) { - q=new Question(*q); - // this is passed to other process over pipe and released there - auto QD=new QuestionData(); - QD->Q=q; + auto QD=new QuestionData(q); auto ret = QD->id = nextid++; // might be deleted after write! QD->callback=callback; ++d_queued; if(write(d_pipes[QD->id % d_pipes.size()].second, &QD, sizeof(QD)) != sizeof(QD)) { --d_queued; + delete QD; unixDie("write"); } @@ -334,7 +325,7 @@ templateint MultiThreadDistributor< // this will leak the entire contents of all pipes, nothing will be freed. Respawn when this happens! throw DistributorFatal(); } - + return ret; } diff --git a/pdns/dnspacket.cc b/pdns/dnspacket.cc index e5c962eaa64d..37d14249347e 100644 --- a/pdns/dnspacket.cc +++ b/pdns/dnspacket.cc @@ -227,7 +227,7 @@ void DNSPacket::setCompress(bool compress) d_rrs.reserve(200); } -bool DNSPacket::couldBeCached() +bool DNSPacket::couldBeCached() const { return !d_wantsnsid && qclass==QClass::IN && !d_havetsig; } @@ -396,10 +396,10 @@ void DNSPacket::setQuestion(int op, const DNSName &qd, int newqtype) qtype=newqtype; } -/** convenience function for creating a reply packet from a question packet. Do not forget to delete it after use! */ -DNSPacket *DNSPacket::replyPacket() const +/** convenience function for creating a reply packet from a question packet. */ +std::unique_ptr DNSPacket::replyPacket() const { - DNSPacket *r=new DNSPacket(false); + auto r=make_unique(false); r->setSocket(d_socket); r->d_anyLocal=d_anyLocal; r->setRemote(&d_remote); @@ -436,7 +436,7 @@ DNSPacket *DNSPacket::replyPacket() const return r; } -void DNSPacket::spoofQuestion(const DNSPacket *qd) +void DNSPacket::spoofQuestion(const DNSPacket& qd) { d_wrapped=true; // if we do this, don't later on wrapup @@ -444,10 +444,10 @@ void DNSPacket::spoofQuestion(const DNSPacket *qd) string::size_type i=sizeof(d); for(;;) { - labellen = qd->d_rawpacket[i]; + labellen = qd.d_rawpacket[i]; if(!labellen) break; i++; - d_rawpacket.replace(i, labellen, qd->d_rawpacket, i, labellen); + d_rawpacket.replace(i, labellen, qd.d_rawpacket, i, labellen); i = i + labellen; } } @@ -639,7 +639,7 @@ bool DNSPacket::hasEDNSSubnet() const return d_haveednssubnet; } -bool DNSPacket::hasEDNS() +bool DNSPacket::hasEDNS() const { return d_haveednssection; } diff --git a/pdns/dnspacket.hh b/pdns/dnspacket.hh index 505c2812f59f..4cf8cc4e25e4 100644 --- a/pdns/dnspacket.hh +++ b/pdns/dnspacket.hh @@ -105,7 +105,7 @@ public: DTime d_dt; //!< the time this packet was created. replyPacket() copies this in for you, so d_dt becomes the time spent processing the question+answer void wrapup(); // writes out queued rrs, and generates the binary packet. also shuffles. also rectifies dnsheader 'd', and copies it to the stringbuffer - void spoofQuestion(const DNSPacket *qd); //!< paste in the exact right case of the question. Useful for PacketCache + void spoofQuestion(const DNSPacket& qd); //!< paste in the exact right case of the question. Useful for PacketCache unsigned int getMinTTL(); //!< returns lowest TTL of any record in the packet bool isEmpty(); //!< returns true if there are no rrs in the packet @@ -113,15 +113,15 @@ public: vector getAnswerRecords(); //!< get a vector with DNSZoneRecords that are answers void setCompress(bool compress); - DNSPacket *replyPacket() const; //!< convenience function that creates a virgin answer packet to this question + std::unique_ptr replyPacket() const; //!< convenience function that creates a virgin answer packet to this question void commitD(); //!< copies 'd' into the stringbuffer unsigned int getMaxReplyLen(); //!< retrieve the maximum length of the packet we should send in response void setMaxReplyLen(int bytes); //!< set the max reply len (used when retrieving from the packet cache, and this changed) - bool couldBeCached(); //!< returns 0 if this query should bypass the packet cache + bool couldBeCached() const; //!< returns 0 if this query should bypass the packet cache bool hasEDNSSubnet() const; - bool hasEDNS(); + bool hasEDNS() const; uint8_t getEDNSVersion() const { return d_ednsversion; }; void setEDNSRcode(uint16_t extRCode) { diff --git a/pdns/dnsproxy.cc b/pdns/dnsproxy.cc index 1eee6185b2f6..05fd4bed19fa 100644 --- a/pdns/dnsproxy.cc +++ b/pdns/dnsproxy.cc @@ -88,7 +88,7 @@ void DNSProxy::go() } //! look up qname target with r->qtype, plonk it in the answer section of 'r' with name aname -bool DNSProxy::completePacket(DNSPacket *r, const DNSName& target,const DNSName& aname, const uint8_t scopeMask) +bool DNSProxy::completePacket(std::unique_ptr& r, const DNSName& target,const DNSName& aname, const uint8_t scopeMask) { if(r->d_tcp) { vector ips; @@ -127,6 +127,7 @@ bool DNSProxy::completePacket(DNSPacket *r, const DNSName& target,const DNSName& } uint16_t id; + uint16_t qtype = r->qtype.getCode(); { Lock l(&d_lock); id=getID_locked(); @@ -139,14 +140,14 @@ bool DNSProxy::completePacket(DNSPacket *r, const DNSName& target,const DNSName& ce.qtype = r->qtype.getCode(); ce.qname = target; ce.anyLocal = r->d_anyLocal; - ce.complete = r; + ce.complete = std::move(r); ce.aname=aname; ce.anameScopeMask = scopeMask; - d_conntrack[id]=ce; + d_conntrack[id]=std::move(ce); } vector packet; - DNSPacketWriter pw(packet, target, r->qtype.getCode()); + DNSPacketWriter pw(packet, target, qtype); pw.getHeader()->rd=true; pw.getHeader()->id=id ^ d_xor; @@ -173,7 +174,7 @@ int DNSProxy::getID_locked() g_log<second.remote.toStringWithPort()<<" with internal id "<second.complete; + i->second.complete.reset(); S.inc("recursion-unanswered"); } return n; @@ -274,8 +275,7 @@ void DNSProxy::mainloop(void) reply=i->second.complete->getString(); iov.iov_base = (void*)reply.c_str(); iov.iov_len = reply.length(); - delete i->second.complete; - i->second.complete=0; + i->second.complete.reset(); msgh.msg_iov = &iov; msgh.msg_iovlen = 1; msgh.msg_name = (struct sockaddr*)&i->second.remote; diff --git a/pdns/dnsproxy.hh b/pdns/dnsproxy.hh index 4478ef4955b7..c4091f59dafb 100644 --- a/pdns/dnsproxy.hh +++ b/pdns/dnsproxy.hh @@ -54,7 +54,7 @@ public: DNSProxy(const string &ip); //!< creates socket ~DNSProxy(); //& r, const DNSName& target,const DNSName& aname, const uint8_t scopeMask); void mainloop(); //!< this is the main loop that receives reply packets and sends them out again static void *launchhelper(void *p) @@ -69,7 +69,7 @@ private: time_t created; boost::optional anyLocal; DNSName qname; - DNSPacket* complete; + std::unique_ptr complete; DNSName aname; uint8_t anameScopeMask; ComboAddress remote; diff --git a/pdns/dnsreplay.cc b/pdns/dnsreplay.cc index 6043c02620d8..f82d6542b0f1 100644 --- a/pdns/dnsreplay.cc +++ b/pdns/dnsreplay.cc @@ -404,7 +404,7 @@ void measureResultAndClean(qids_t::const_iterator iter) } -Socket *s_socket; +std::unique_ptr s_socket = nullptr; void receiveFromReference() try @@ -772,7 +772,7 @@ try g_timeoutMsec=g_vm["timeout-msec"].as(); PcapPacketReader pr(g_vm["pcap-source"].as()); - s_socket= new Socket(AF_INET, SOCK_DGRAM); + s_socket= make_unique(AF_INET, SOCK_DGRAM); s_socket->setNonBlocking(); diff --git a/pdns/dnsscope.cc b/pdns/dnsscope.cc index a31106e6cc15..ce399f663aec 100644 --- a/pdns/dnsscope.cc +++ b/pdns/dnsscope.cc @@ -222,9 +222,9 @@ try for(unsigned int fno=0; fno < files.size(); ++fno) { PcapPacketReader pr(files[fno]); - PcapPacketWriter* pw=0; + std::unique_ptr pw=nullptr; if(!g_vm["write-failures"].as().empty()) - pw=new PcapPacketWriter(g_vm["write-failures"].as(), pr); + pw=std::unique_ptr(new PcapPacketWriter(g_vm["write-failures"].as(), pr)); EDNSOpts edo; while(pr.getUDPPacket()) { diff --git a/pdns/dnstcpbench.cc b/pdns/dnstcpbench.cc index 596d62ae3f6c..eef62272903e 100644 --- a/pdns/dnstcpbench.cc +++ b/pdns/dnstcpbench.cc @@ -132,18 +132,17 @@ try throw PDNSException("tcp read failed"); len=ntohs(len); - char *creply = new char[len]; + std::unique_ptr creply(new char[len]); int n=0; int numread; while(ntcpUsec = makeUsec(now - tv); diff --git a/pdns/lua-auth4.cc b/pdns/lua-auth4.cc index dae104b14032..a6841680a605 100644 --- a/pdns/lua-auth4.cc +++ b/pdns/lua-auth4.cc @@ -20,10 +20,10 @@ AuthLua4::AuthLua4() { prepareContext(); } #if !defined(HAVE_LUA) -bool AuthLua4::updatePolicy(const DNSName &qname, QType qtype, const DNSName &zonename, DNSPacket *packet) { return false; } +bool AuthLua4::updatePolicy(const DNSName &qname, QType qtype, const DNSName &zonename, const DNSPacket& packet) { return false; } bool AuthLua4::axfrfilter(const ComboAddress& remote, const DNSName& zone, const DNSResourceRecord& in, vector& out) { return false; } -LuaContext* AuthLua4::getLua() { return 0; } -DNSPacket *AuthLua4::prequery(DNSPacket *q) { return NULL; } +LuaContext* AuthLua4::getLua() { return nullptr; } +std::unique_ptr AuthLua4::prequery(const DNSPacket& q) { return nullptr; } AuthLua4::~AuthLua4() { } @@ -56,8 +56,8 @@ void AuthLua4::postPrepareContext() { }); /* DNSPacket */ - d_lw->writeFunction("newDNSPacket", [](bool isQuery) { return new DNSPacket(isQuery); }); - d_lw->writeFunction("dupDNSPacket", [](const DNSPacket &orig) { return new DNSPacket(orig); }); + d_lw->writeFunction("newDNSPacket", [](bool isQuery) { return make_unique(isQuery); }); + d_lw->writeFunction("dupDNSPacket", [](const std::unique_ptr &orig) { return make_unique(*orig); }); d_lw->registerFunction("noparse", [](DNSPacket &p, const char *mesg, size_t len){ return p.noparse(mesg, len); }); d_lw->registerFunction("parse", [](DNSPacket &p, const char *mesg, size_t len){ return p.parse(mesg, len); }); d_lw->registerFunction("getString", [](DNSPacket &p) { return p.getString(); }); @@ -79,7 +79,7 @@ void AuthLua4::postPrepareContext() { d_lw->registerFunction >&)>("addRecords", [](DNSPacket &p, const vector >& records){ for(const auto &dr: records){ DNSZoneRecord dzr; dzr.dr = std::get<1>(dr); dzr.auth = true; p.addRecord(dzr); }}); d_lw->registerFunction("setQuestion", [](DNSPacket &p, unsigned int opcode, const DNSName &name, const string &type){ QType qtype; qtype = type; p.setQuestion(static_cast(opcode), name, static_cast(qtype.getCode())); }); d_lw->registerFunction("isEmpty", [](DNSPacket &p){return p.isEmpty();}); - d_lw->registerFunction("replyPacket",[](DNSPacket& p){ return p.replyPacket();}); + d_lw->registerFunction()>("replyPacket",[](DNSPacket& p){ return p.replyPacket();}); d_lw->registerFunction("hasEDNSSubnet", [](DNSPacket &p){return p.hasEDNSSubnet();}); d_lw->registerFunction("hasEDNS",[](DNSPacket &p){return p.hasEDNS();}); d_lw->registerFunction("getEDNSVersion",[](DNSPacket &p){return p.getEDNSVersion();}); @@ -159,31 +159,31 @@ bool AuthLua4::axfrfilter(const ComboAddress& remote, const DNSName& zone, const } -bool AuthLua4::updatePolicy(const DNSName &qname, QType qtype, const DNSName &zonename, DNSPacket *packet) { +bool AuthLua4::updatePolicy(const DNSName &qname, QType qtype, const DNSName &zonename, const DNSPacket& packet) { // default decision is all goes - if (d_update_policy == NULL) return true; + if (d_update_policy == nullptr) return true; UpdatePolicyQuery upq; upq.qname = qname; upq.qtype = qtype.getCode(); upq.zonename = zonename; - upq.local = packet->getLocal(); - upq.remote = packet->getRemote(); - upq.realRemote = packet->getRealRemote(); - upq.tsigName = packet->getTSIGKeyname(); - upq.peerPrincipal = packet->d_peer_principal; + upq.local = packet.getLocal(); + upq.remote = packet.getRemote(); + upq.realRemote = packet.getRealRemote(); + upq.tsigName = packet.getTSIGKeyname(); + upq.peerPrincipal = packet.d_peer_principal; return d_update_policy(upq); } -DNSPacket *AuthLua4::prequery(DNSPacket *q) { - if (d_prequery == NULL) return NULL; +std::unique_ptr AuthLua4::prequery(const DNSPacket& q) { + if (d_prequery == nullptr) return nullptr; - DNSPacket *r = q->replyPacket(); - if (d_prequery(r)) + auto r = q.replyPacket(); + if (d_prequery(r.get())) return r; - delete r; - return NULL; + + return nullptr; } AuthLua4::~AuthLua4() { } diff --git a/pdns/lua-auth4.hh b/pdns/lua-auth4.hh index 4e7d7c06e437..3e8af48ecd58 100644 --- a/pdns/lua-auth4.hh +++ b/pdns/lua-auth4.hh @@ -13,11 +13,11 @@ class AuthLua4 : public BaseLua4 { public: AuthLua4(); - bool updatePolicy(const DNSName &qname, QType qtype, const DNSName &zonename, DNSPacket *packet); + bool updatePolicy(const DNSName &qname, QType qtype, const DNSName &zonename, const DNSPacket& packet); bool axfrfilter(const ComboAddress&, const DNSName&, const DNSResourceRecord&, std::vector&); LuaContext* getLua(); - DNSPacket *prequery(DNSPacket *p); + std::unique_ptr prequery(const DNSPacket& p); ~AuthLua4(); // this is so unique_ptr works with an incomplete type protected: diff --git a/pdns/nameserver.cc b/pdns/nameserver.cc index 7f0785989bea..77344b521993 100644 --- a/pdns/nameserver.cc +++ b/pdns/nameserver.cc @@ -289,30 +289,30 @@ UDPNameserver::UDPNameserver( bool additional_socket ) g_log<getString(); - g_rs.submitResponse(*p, true); + string buffer=p.getString(); + g_rs.submitResponse(p, true); struct msghdr msgh; struct iovec iov; cmsgbuf_aligned cbuf; - fillMSGHdr(&msgh, &iov, &cbuf, 0, (char*)buffer.c_str(), buffer.length(), &p->d_remote); + fillMSGHdr(&msgh, &iov, &cbuf, 0, (char*)buffer.c_str(), buffer.length(), &p.d_remote); msgh.msg_control=NULL; - if(p->d_anyLocal) { - addCMsgSrcAddr(&msgh, &cbuf, p->d_anyLocal.get_ptr(), 0); + if(p.d_anyLocal) { + addCMsgSrcAddr(&msgh, &cbuf, p.d_anyLocal.get_ptr(), 0); } - DLOG(g_log<getRemote() <<" ("<< buffer.length()<<" octets)"< p->getMaxReplyLen()) { - g_log< "<getMaxReplyLen()<<". Question was for "<qdomain<<"|"<qtype.getName()< p.getMaxReplyLen()) { + g_log< "<getSocket(), &msgh, 0) < 0) - g_log<setSocket(sock); - packet->setRemote(&remote); + packet.setSocket(sock); + packet.setRemote(&remote); ComboAddress dest; if(HarvestDestinationAddress(&msgh, &dest)) { // cerr<<"Setting d_anyLocal to '"<d_anyLocal = dest; + packet.d_anyLocal = dest; } struct timeval recvtv; if(HarvestTimestamp(&msgh, &recvtv)) { - packet->d_dt.setTimeval(recvtv); + packet.d_dt.setTimeval(recvtv); } else - packet->d_dt.set(); // timing + packet.d_dt.set(); // timing - if(packet->parse(&buffer.at(0), (size_t) len)<0) { + if(packet.parse(&buffer.at(0), (size_t) len)<0) { S.inc("corrupt-packets"); - S.ringAccount("remotes-corrupt", packet->d_remote); + S.ringAccount("remotes-corrupt", packet.d_remote); - if(!prefilled) - delete packet; - return 0; // unable to parse + return false; // unable to parse } - return packet; + return true; } diff --git a/pdns/nameserver.hh b/pdns/nameserver.hh index d9d04198f286..d879fa54038b 100644 --- a/pdns/nameserver.hh +++ b/pdns/nameserver.hh @@ -81,8 +81,8 @@ class UDPNameserver { public: UDPNameserver( bool additional_socket = false ); //!< Opens the socket - DNSPacket *receive(DNSPacket *prefilled, std::string& buffer); //!< call this in a while or for(;;) loop to get packets - void send(DNSPacket *); //!< send a DNSPacket. Will call DNSPacket::truncate() if over 512 bytes + bool receive(DNSPacket& packet, std::string& buffer); //!< call this in a while or for(;;) loop to get packets + void send(DNSPacket&); //!< send a DNSPacket. Will call DNSPacket::truncate() if over 512 bytes inline bool canReusePort() { #ifdef SO_REUSEPORT return d_can_reuseport; diff --git a/pdns/nsec3dig.cc b/pdns/nsec3dig.cc index eb6430491f3b..35ca57bf1883 100644 --- a/pdns/nsec3dig.cc +++ b/pdns/nsec3dig.cc @@ -142,18 +142,17 @@ try throw PDNSException("tcp read failed"); len=ntohs(len); - char *creply = new char[len]; + std::unique_ptr creply(new char[len]); int n=0; int numread; while(nqdomain); + DNSSECKeeper::keyset_t entryPoints = d_dk.getEntryPoints(p.qdomain); for(const auto& value: entryPoints) { rr.dr.d_type=QType::CDNSKEY; rr.dr.d_ttl=sd.default_ttl; - rr.dr.d_name=p->qdomain; + rr.dr.d_name=p.qdomain; rr.dr.d_content=std::make_shared(value.first.getDNSKEY()); rr.auth=true; r->addRecord(rr); @@ -127,7 +127,7 @@ bool PacketHandler::addCDNSKEY(DNSPacket *p, DNSPacket *r, const SOAData& sd) } if(::arg().mustDo("direct-dnskey")) { - B.lookup(QType(QType::CDNSKEY), p->qdomain, sd.domain_id, p); + B.lookup(QType(QType::CDNSKEY), p.qdomain, sd.domain_id, &p); while(B.get(rr)) { rr.dr.d_ttl=sd.default_ttl; @@ -146,16 +146,16 @@ bool PacketHandler::addCDNSKEY(DNSPacket *p, DNSPacket *r, const SOAData& sd) * @param sd SOAData of the zone for which DNSKEY records sets should be added * @return bool that shows if any records were added **/ -bool PacketHandler::addDNSKEY(DNSPacket *p, DNSPacket *r, const SOAData& sd) +bool PacketHandler::addDNSKEY(DNSPacket& p, std::unique_ptr& r, const SOAData& sd) { DNSZoneRecord rr; bool haveOne=false; - DNSSECKeeper::keyset_t keyset = d_dk.getKeys(p->qdomain); + DNSSECKeeper::keyset_t keyset = d_dk.getKeys(p.qdomain); for(const auto& value: keyset) { rr.dr.d_type=QType::DNSKEY; rr.dr.d_ttl=sd.default_ttl; - rr.dr.d_name=p->qdomain; + rr.dr.d_name=p.qdomain; rr.dr.d_content=std::make_shared(value.first.getDNSKEY()); rr.auth=true; r->addRecord(rr); @@ -163,7 +163,7 @@ bool PacketHandler::addDNSKEY(DNSPacket *p, DNSPacket *r, const SOAData& sd) } if(::arg().mustDo("direct-dnskey")) { - B.lookup(QType(QType::DNSKEY), p->qdomain, sd.domain_id, p); + B.lookup(QType(QType::DNSKEY), p.qdomain, sd.domain_id, &p); while(B.get(rr)) { rr.dr.d_ttl=sd.default_ttl; @@ -184,10 +184,10 @@ bool PacketHandler::addDNSKEY(DNSPacket *p, DNSPacket *r, const SOAData& sd) * used to determine record TTL. * @return bool that shows if any records were added. **/ -bool PacketHandler::addCDS(DNSPacket *p, DNSPacket *r, const SOAData& sd) +bool PacketHandler::addCDS(DNSPacket& p, std::unique_ptr& r, const SOAData& sd) { string publishCDS; - d_dk.getFromMeta(p->qdomain, "PUBLISH-CDS", publishCDS); + d_dk.getFromMeta(p.qdomain, "PUBLISH-CDS", publishCDS); if (publishCDS.empty()) return false; @@ -197,23 +197,23 @@ bool PacketHandler::addCDS(DNSPacket *p, DNSPacket *r, const SOAData& sd) DNSZoneRecord rr; rr.dr.d_type=QType::CDS; rr.dr.d_ttl=sd.default_ttl; - rr.dr.d_name=p->qdomain; + rr.dr.d_name=p.qdomain; rr.auth=true; bool haveOne=false; - DNSSECKeeper::keyset_t keyset = d_dk.getEntryPoints(p->qdomain); + DNSSECKeeper::keyset_t keyset = d_dk.getEntryPoints(p.qdomain); for(auto const &value : keyset) { for(auto const &digestAlgo : digestAlgos){ - rr.dr.d_content=std::make_shared(makeDSFromDNSKey(p->qdomain, value.first.getDNSKEY(), pdns_stou(digestAlgo))); + rr.dr.d_content=std::make_shared(makeDSFromDNSKey(p.qdomain, value.first.getDNSKEY(), pdns_stou(digestAlgo))); r->addRecord(rr); haveOne=true; } } if(::arg().mustDo("direct-dnskey")) { - B.lookup(QType(QType::CDS), p->qdomain, sd.domain_id, p); + B.lookup(QType(QType::CDS), p.qdomain, sd.domain_id, &p); while(B.get(rr)) { rr.dr.d_ttl=sd.default_ttl; @@ -226,15 +226,15 @@ bool PacketHandler::addCDS(DNSPacket *p, DNSPacket *r, const SOAData& sd) } /** This adds NSEC3PARAM records. Returns true if one was added */ -bool PacketHandler::addNSEC3PARAM(DNSPacket *p, DNSPacket *r, const SOAData& sd) +bool PacketHandler::addNSEC3PARAM(const DNSPacket& p, std::unique_ptr& r, const SOAData& sd) { DNSZoneRecord rr; NSEC3PARAMRecordContent ns3prc; - if(d_dk.getNSEC3PARAM(p->qdomain, &ns3prc)) { + if(d_dk.getNSEC3PARAM(p.qdomain, &ns3prc)) { rr.dr.d_type=QType::NSEC3PARAM; rr.dr.d_ttl=sd.default_ttl; - rr.dr.d_name=p->qdomain; + rr.dr.d_name=p.qdomain; ns3prc.d_flags = 0; // the NSEC3PARAM 'flag' is defined to always be zero in RFC5155. rr.dr.d_content=std::make_shared(ns3prc); rr.auth = true; @@ -246,11 +246,11 @@ bool PacketHandler::addNSEC3PARAM(DNSPacket *p, DNSPacket *r, const SOAData& sd) // This is our chaos class requests handler. Return 1 if content was added, 0 if it wasn't -int PacketHandler::doChaosRequest(DNSPacket *p, DNSPacket *r, DNSName &target) +int PacketHandler::doChaosRequest(const DNSPacket& p, std::unique_ptr& r, DNSName &target) const { DNSZoneRecord rr; - if(p->qtype.getCode()==QType::TXT) { + if(p.qtype.getCode()==QType::TXT) { static const DNSName versionbind("version.bind."), versionpdns("version.pdns."), idserver("id.server."); if (target==versionbind || target==versionpdns) { // modes: full, powerdns only, anonymous or custom @@ -299,7 +299,7 @@ int PacketHandler::doChaosRequest(DNSPacket *p, DNSPacket *r, DNSName &target) return 0; } -vector PacketHandler::getBestReferralNS(DNSPacket *p, SOAData& sd, const DNSName &target) +vector PacketHandler::getBestReferralNS(DNSPacket& p, const SOAData& sd, const DNSName &target) { vector ret; DNSZoneRecord rr; @@ -307,7 +307,7 @@ vector PacketHandler::getBestReferralNS(DNSPacket *p, SOAData& sd do { if(subdomain == sd.qname) // stop at SOA break; - B.lookup(QType(QType::NS), subdomain, sd.domain_id, p); + B.lookup(QType(QType::NS), subdomain, sd.domain_id, &p); while(B.get(rr)) { ret.push_back(rr); // this used to exclude auth NS records for some reason } @@ -317,7 +317,7 @@ vector PacketHandler::getBestReferralNS(DNSPacket *p, SOAData& sd return ret; } -vector PacketHandler::getBestDNAMESynth(DNSPacket *p, SOAData& sd, DNSName &target) +vector PacketHandler::getBestDNAMESynth(DNSPacket& p, const SOAData& sd, DNSName &target) { vector ret; DNSZoneRecord rr; @@ -326,7 +326,7 @@ vector PacketHandler::getBestDNAMESynth(DNSPacket *p, SOAData& sd do { DLOG(g_log<<"Attempting DNAME lookup for "<(rr.dr); if (!rec) { continue; } - if(rec->d_type == QType::CNAME || rec->d_type == p->qtype.getCode() || (p->qtype.getCode() == QType::ANY && rec->d_type != QType::RRSIG)) { + if(rec->d_type == QType::CNAME || rec->d_type == p.qtype.getCode() || (p.qtype.getCode() == QType::ANY && rec->d_type != QType::RRSIG)) { // noCache=true; DLOG(g_log<<"Executing Lua: '"<getCode()<<"'"<getCode(), target, sd.qname, sd.domain_id, *p, rec->d_type); + auto recvec=luaSynth(rec->getCode(), target, sd.qname, sd.domain_id, p, rec->d_type); for(const auto& r : recvec) { rr.dr.d_type = rec->d_type; // might be CNAME rr.dr.d_content = r; - rr.scopeMask = p->getRealRemote().getBits(); // this makes sure answer is a specific as your question + rr.scopeMask = p.getRealRemote().getBits(); // this makes sure answer is a specific as your question ret->push_back(rr); } } } else #endif - if(rr.dr.d_type == p->qtype.getCode() || rr.dr.d_type == QType::CNAME || (p->qtype.getCode() == QType::ANY && rr.dr.d_type != QType::RRSIG)) { + if(rr.dr.d_type == p.qtype.getCode() || rr.dr.d_type == QType::CNAME || (p.qtype.getCode() == QType::ANY && rr.dr.d_type != QType::RRSIG)) { ret->push_back(rr); } - + wildcard=g_wildcarddnsname+subdomain; haveSomething=true; } @@ -411,7 +411,7 @@ bool PacketHandler::getBestWildcard(DNSPacket *p, SOAData& sd, const DNSName &ta if ( subdomain == sd.qname || haveSomething ) // stop at SOA or result break; - B.lookup(QType(QType::ANY), subdomain, sd.domain_id, p); + B.lookup(QType(QType::ANY), subdomain, sd.domain_id, &p); if (B.get(rr)) { DLOG(g_log<<"No wildcard match, ancestor exists"<& r, const SOAData& soadata, bool retargeted) { DNSZoneRecord rr; SOAData sd; sd.db=0; - if(p->qtype.getCode()!=QType::AXFR) { // this packet needs additional processing + if(p.qtype.getCode()!=QType::AXFR) { // this packet needs additional processing // we now have a copy, push_back on packet might reallocate! auto& records = r->getRRS(); vector toAdd; @@ -456,7 +456,7 @@ int PacketHandler::doAdditionalProcessingAndDropAA(DNSPacket *p, DNSPacket *r, c else continue; - B.lookup(QType(d_doIPv6AdditionalProcessing ? QType::ANY : QType::A), lookup, soadata.domain_id, p); + B.lookup(QType(d_doIPv6AdditionalProcessing ? QType::ANY : QType::A), lookup, soadata.domain_id, &p); while(B.get(rr)) { if(rr.dr.d_type != QType::A && rr.dr.d_type!=QType::AAAA) @@ -479,7 +479,7 @@ int PacketHandler::doAdditionalProcessingAndDropAA(DNSPacket *p, DNSPacket *r, c } -void PacketHandler::emitNSEC(DNSPacket *r, const SOAData& sd, const DNSName& name, const DNSName& next, int mode) +void PacketHandler::emitNSEC(std::unique_ptr& r, const SOAData& sd, const DNSName& name, const DNSName& next, int mode) { NSECRecordContent nrc; nrc.d_next = next; @@ -522,7 +522,7 @@ void PacketHandler::emitNSEC(DNSPacket *r, const SOAData& sd, const DNSName& nam r->addRecord(rr); } -void PacketHandler::emitNSEC3(DNSPacket *r, const SOAData& sd, const NSEC3PARAMRecordContent& ns3prc, const DNSName& name, const string& namehash, const string& nexthash, int mode) +void PacketHandler::emitNSEC3(std::unique_ptr& r, const SOAData& sd, const NSEC3PARAMRecordContent& ns3prc, const DNSName& name, const string& namehash, const string& nexthash, int mode) { NSEC3RecordContent n3rc; n3rc.d_algorithm = ns3prc.d_algorithm; @@ -583,7 +583,7 @@ void PacketHandler::emitNSEC3(DNSPacket *r, const SOAData& sd, const NSEC3PARAMR mode 4 = Name Error Responses mode 5 = Direct NSEC request */ -void PacketHandler::addNSECX(DNSPacket *p, DNSPacket *r, const DNSName& target, const DNSName& wildcard, const DNSName& auth, int mode) +void PacketHandler::addNSECX(DNSPacket& p, std::unique_ptr& r, const DNSName& target, const DNSName& wildcard, const DNSName& auth, int mode) { NSEC3PARAMRecordContent ns3rc; bool narrow; @@ -596,7 +596,7 @@ void PacketHandler::addNSECX(DNSPacket *p, DNSPacket *r, const DNSName& target, } } -bool getNSEC3Hashes(bool narrow, DNSBackend* db, int id, const std::string& hashed, bool decrement, DNSName& unhashed, std::string& before, std::string& after, int mode) +static bool getNSEC3Hashes(bool narrow, DNSBackend* db, int id, const std::string& hashed, bool decrement, DNSName& unhashed, std::string& before, std::string& after, int mode=0) { bool ret; if(narrow) { // nsec3-narrow @@ -621,7 +621,7 @@ bool getNSEC3Hashes(bool narrow, DNSBackend* db, int id, const std::string& hash return ret; } -void PacketHandler::addNSEC3(DNSPacket *p, DNSPacket *r, const DNSName& target, const DNSName& wildcard, const DNSName& auth, const NSEC3PARAMRecordContent& ns3rc, bool narrow, int mode) +void PacketHandler::addNSEC3(DNSPacket& p, std::unique_ptr& r, const DNSName& target, const DNSName& wildcard, const DNSName& auth, const NSEC3PARAMRecordContent& ns3rc, bool narrow, int mode) { DLOG(g_log<<"addNSEC3() mode="<getRealRemote().getNetwork(); + ComboAddress remote = p.getRemote().setPort(53); + if(p.hasEDNSSubnet() && ::arg().contains("trusted-notification-proxy", remote.toString())) { + remote = p.getRealRemote().getNetwork(); } Resolver::res_t nsset; try { Resolver resolver; uint32_t theirserial; - resolver.getSoaSerial(remote, p->qdomain, &theirserial); - resolver.resolve(remote, p->qdomain, QType::NS, &nsset); + resolver.getSoaSerial(remote, p.qdomain, &theirserial); + resolver.resolve(remote, p.qdomain, QType::NS, &nsset); } catch(ResolverException &re) { - g_log<qdomain<<" at: "<< remote <<": "<qdomain<<" at: "<< remote <qdomain<<" from potential supermaster "<qdomain, nsset, &nameserver, &account, &db)) { - g_log<qdomain<<" for potential supermaster "<createSlaveDomain(p->getRemote().toString(), p->qdomain, nameserver, account); + db->createSlaveDomain(p.getRemote().toString(), p.qdomain, nameserver, account); if (tsigkeyname.empty() == false) { vector meta; meta.push_back(tsigkeyname.toStringNoDot()); - db->setDomainMetadata(p->qdomain, "AXFR-MASTER-TSIG", meta); + db->setDomainMetadata(p.qdomain, "AXFR-MASTER-TSIG", meta); } } catch(PDNSException& ae) { - g_log<qdomain<<" for potential supermaster "<qdomain<<"' from supermaster "< do stuff */ - g_log<qdomain<<" from "<getRemote()<qdomain<<" from "<getRemote()<<" but slave support is disabled in the configuration"<d_remote ) || p->d_havetsig) { - if (p->d_havetsig && p->getTSIGKeyname().empty() == false) { - g_log<qdomain<<" from "<getRemote()<<", with TSIG key '"<getTSIGKeyname()<<"'"<qdomain<<" from "<getRemote()<<" but the remote is not providing a TSIG key or in allow-notify-from (Refused)"<d_havetsig) || p->d_havetsig) { - if (!p->d_havetsig) { - g_log<qdomain<<" from "<getRemote()<<" while a TSIG key was required (Refused)"< meta; - if (B.getDomainMetadata(p->qdomain,"AXFR-MASTER-TSIG",meta) && meta.size() > 0) { + if (B.getDomainMetadata(p.qdomain,"AXFR-MASTER-TSIG",meta) && meta.size() > 0) { DNSName expected{meta[0]}; - if (p->getTSIGKeyname() != expected) { - g_log<qdomain<<" from "<getRemote()<<": expected TSIG key '"<getTSIGKeyname()<<"' (Refused)"<qdomain, di, false) || !di.backend) { + if(!B.getDomainInfo(p.qdomain, di, false) || !di.backend) { if(::arg().mustDo("superslave")) { - g_log<qdomain<<" from "<getRemote()<<" for which we are not authoritative, trying supermaster"<getTSIGKeyname()); + g_log<qdomain<<" from "<getRemote()<<" for which we are not authoritative (Refused)"<getRemote().toString())) { - g_log<qdomain<<" from trusted-notification-proxy "<< p->getRemote()<qdomain<<" does not have any masters defined (Refused)"<qdomain<<" from "<getRemote()<<" but we are master (Refused)"<getRemote())) { - g_log<qdomain<<" from "<getRemote()<<" which is not a master (Refused)"< forwardNotify(s_forwardNotify); for(set::const_iterator j=forwardNotify.begin();j!=forwardNotify.end();++j) { - g_log<qdomain<<" from "<getRemote()<<" to "<<*j<qdomain,*j); + g_log<qdomain<d_remote); + g_log< PacketHandler::question(DNSPacket& p) { - DNSPacket *ret; + std::unique_ptr ret{nullptr}; if(d_pdl) { @@ -955,7 +955,7 @@ DNSPacket *PacketHandler::question(DNSPacket *p) return ret; } - if(p->d.rd) { + if(p.d.rd) { static AtomicCounter &rdqueries=*S.getPointer("rd-queries"); rdqueries++; } @@ -964,7 +964,7 @@ DNSPacket *PacketHandler::question(DNSPacket *p) } -void PacketHandler::makeNXDomain(DNSPacket* p, DNSPacket* r, const DNSName& target, const DNSName& wildcard, const SOAData& sd) +void PacketHandler::makeNXDomain(DNSPacket& p, std::unique_ptr& r, const DNSName& target, const DNSName& wildcard, const SOAData& sd) { DNSZoneRecord rr; rr=makeEditedDNSZRFromSOAData(d_dk, sd, DNSResourceRecord::AUTHORITY); @@ -978,7 +978,7 @@ void PacketHandler::makeNXDomain(DNSPacket* p, DNSPacket* r, const DNSName& targ r->setRcode(RCode::NXDomain); } -void PacketHandler::makeNOError(DNSPacket* p, DNSPacket* r, const DNSName& target, const DNSName& wildcard, const SOAData& sd, int mode) +void PacketHandler::makeNOError(DNSPacket& p, std::unique_ptr& r, const DNSName& target, const DNSName& wildcard, const SOAData& sd, int mode) { DNSZoneRecord rr; rr=makeEditedDNSZRFromSOAData(d_dk, sd, DNSResourceRecord::AUTHORITY); @@ -989,14 +989,14 @@ void PacketHandler::makeNOError(DNSPacket* p, DNSPacket* r, const DNSName& targe addNSECX(p, r, target, wildcard, sd.qname, mode); } - S.ringAccount("noerror-queries", p->qdomain, p->qtype); + S.ringAccount("noerror-queries", p.qdomain, p.qtype); } -bool PacketHandler::addDSforNS(DNSPacket* p, DNSPacket* r, SOAData& sd, const DNSName& dsname) +bool PacketHandler::addDSforNS(DNSPacket& p, std::unique_ptr& r, const SOAData& sd, const DNSName& dsname) { //cerr<<"Trying to find a DS for '"<getRemote()<<", dropping"<d_remote); + S.ringAccount("remotes-corrupt", p.d_remote); return 0; } - if(p->d.tc) { // truncated query. MOADNSParser would silently parse this packet in an incomplete way. + if(p.d.tc) { // truncated query. MOADNSParser would silently parse this packet in an incomplete way. if(d_logDNSDetails) - g_log<getRemote()<<", dropping"<d_remote); + S.ringAccount("remotes-corrupt", p.d_remote); return 0; } - if (p->hasEDNS() && p->getEDNSVersion() > 0) { - r = p->replyPacket(); + if (p.hasEDNS() && p.getEDNSVersion() > 0) { + r = p.replyPacket(); // PacketWriter::addOpt will take care of setting this correctly in the packet r->setEDNSRcode(ERCode::BADVERS); return r; } - if(p->d_havetsig) { + if(p.d_havetsig) { DNSName keyname; string secret; TSIGRecordContent trc; - if(!p->checkForCorrectTSIG(&B, &keyname, &secret, &trc)) { - r=p->replyPacket(); // generate an empty reply packet + if(!p.checkForCorrectTSIG(&B, &keyname, &secret, &trc)) { + r=p.replyPacket(); // generate an empty reply packet if(d_logDNSDetails) g_log<d.opcode == Opcode::Update) + if (p.d.opcode == Opcode::Update) r->setRcode(RCode::Refused); else r->setRcode(RCode::NotAuth); return r; } else { - getTSIGHashEnum(trc.d_algoName, p->d_tsig_algo); - if (p->d_tsig_algo == TSIG_GSS) { + getTSIGHashEnum(trc.d_algoName, p.d_tsig_algo); + if (p.d_tsig_algo == TSIG_GSS) { GssContext gssctx(keyname); - if (!gssctx.getPeerPrincipal(p->d_peer_principal)) { + if (!gssctx.getPeerPrincipal(p.d_peer_principal)) { g_log<setTSIGDetails(trc, keyname, secret, trc.d_mac); // this will get copied by replyPacket() + p.setTSIGDetails(trc, keyname, secret, trc.d_mac); // this will get copied by replyPacket() noCache=true; } - r=p->replyPacket(); // generate an empty reply packet, possibly with TSIG details inside + r=p.replyPacket(); // generate an empty reply packet, possibly with TSIG details inside - if (p->qtype == QType::TKEY) { + if (p.qtype == QType::TKEY) { this->tkeyHandler(p, r); return r; } @@ -1170,17 +1170,17 @@ DNSPacket *PacketHandler::doQuestion(DNSPacket *p) // XXX FIXME do this in DNSPacket::parse ? - if(!validDNSName(p->qdomain)) { + if(!validDNSName(p.qdomain)) { if(d_logDNSDetails) - g_log<getRemote()<<", '"<qdomain<<"': sending servfail"<d_remote); + S.ringAccount("remotes-corrupt", p.d_remote); S.inc("servfail-packets"); r->setRcode(RCode::ServFail); return r; } - if(p->d.opcode) { // non-zero opcode (again thanks RA!) - if(p->d.opcode==Opcode::Update) { + if(p.d.opcode) { // non-zero opcode (again thanks RA!) + if(p.d.opcode==Opcode::Update) { S.inc("dnsupdate-queries"); int res=processUpdate(p); if (res == RCode::Refused) @@ -1191,7 +1191,7 @@ DNSPacket *PacketHandler::doQuestion(DNSPacket *p) r->setOpcode(Opcode::Update); return r; } - else if(p->d.opcode==Opcode::Notify) { + else if(p.d.opcode==Opcode::Notify) { S.inc("incoming-notifications"); int res=processNotify(p); if(res>=0) { @@ -1199,27 +1199,26 @@ DNSPacket *PacketHandler::doQuestion(DNSPacket *p) r->setOpcode(Opcode::Notify); return r; } - delete r; return 0; } - g_log<d.opcode<<" from "<getRemote()<<" for "<qdomain<setRcode(RCode::NotImp); return r; } - // g_log<qdomain<<"' "<qtype.getName()<<" from "<getRemote()<< " (tcp="<d_tcp<<")"<qtype.getCode()==QType::IXFR) { + if(p.qtype.getCode()==QType::IXFR) { r->setRcode(RCode::Refused); return r; } - DNSName target=p->qdomain; + DNSName target=p.qdomain; // catch chaos qclass requests - if(p->qclass == QClass::CHAOS) { + if(p.qclass == QClass::CHAOS) { if (doChaosRequest(p,r,target)) goto sendit; else @@ -1227,33 +1226,32 @@ DNSPacket *PacketHandler::doQuestion(DNSPacket *p) } // we only know about qclass IN (and ANY), send Refused for everything else. - if(p->qclass != QClass::IN && p->qclass!=QClass::ANY) { + if(p.qclass != QClass::IN && p.qclass!=QClass::ANY) { r->setRcode(RCode::Refused); return r; } // send TC for udp ANY query if any-to-tcp is enabled. - if(p->qtype.getCode() == QType::ANY && !p->d_tcp && g_anyToTcp) { + if(p.qtype.getCode() == QType::ANY && !p.d_tcp && g_anyToTcp) { r->d.tc = 1; r->commitD(); return r; } // for qclass ANY the response should never be authoritative unless the response covers all classes. - if(p->qclass==QClass::ANY) + if(p.qclass==QClass::ANY) r->setA(false); retargeted:; if(retargetcount > 10) { // XXX FIXME, retargetcount++? - g_log<qdomain<<"'"<replyPacket(); + g_log<setRcode(RCode::ServFail); return r; } - if(!B.getAuth(target, p->qtype, &sd)) { + if(!B.getAuth(target, p.qtype, &sd)) { DLOG(g_log<setA(false); // drop AA if we never had a SOA in the first place @@ -1264,56 +1262,56 @@ DNSPacket *PacketHandler::doQuestion(DNSPacket *p) DLOG(g_log<getRemote()<setRcode(RCode::Refused); goto sendit; } DLOG(g_log<<"Checking for referrals first, unless this is a DS query"<qtype.getCode() != QType::DS && tryReferral(p, r, sd, target, retargetcount)) + if(p.qtype.getCode() != QType::DS && tryReferral(p, r, sd, target, retargetcount)) goto sendit; DLOG(g_log<<"Got no referrals, trying ANY"<d_type == QType::CNAME || rec->d_type == p->qtype.getCode() || (p->qtype.getCode() == QType::ANY && rec->d_type != QType::RRSIG)) { + if(rec->d_type == QType::CNAME || rec->d_type == p.qtype.getCode() || (p.qtype.getCode() == QType::ANY && rec->d_type != QType::RRSIG)) { noCache=true; try { - auto recvec=luaSynth(rec->getCode(), target, sd.qname, sd.domain_id, *p, rec->d_type); + auto recvec=luaSynth(rec->getCode(), target, sd.qname, sd.domain_id, p, rec->d_type); if(!recvec.empty()) { for(const auto& r : recvec) { rr.dr.d_type = rec->d_type; // might be CNAME rr.dr.d_content = r; - rr.scopeMask = p->getRealRemote().getBits(); // this makes sure answer is a specific as your question + rr.scopeMask = p.getRealRemote().getBits(); // this makes sure answer is a specific as your question rrset.push_back(rr); } - if(rec->d_type == QType::CNAME && p->qtype.getCode() != QType::CNAME) + if(rec->d_type == QType::CNAME && p.qtype.getCode() != QType::CNAME) weRedirected = 1; else weDone = 1; } } catch(std::exception &e) { - r=p->replyPacket(); + r=p.replyPacket(); r->setRcode(RCode::ServFail); return r; @@ -1369,22 +1367,22 @@ DNSPacket *PacketHandler::doQuestion(DNSPacket *p) } #endif //cerr<<"got content: ["<qtype.getCode() == QType::ANY && (rr.dr.d_type == QType:: DNSKEY || rr.dr.d_type == QType::NSEC3PARAM)) + if (!d_dnssec && p.qtype.getCode() == QType::ANY && (rr.dr.d_type == QType:: DNSKEY || rr.dr.d_type == QType::NSEC3PARAM)) continue; // Don't send dnssec info. if (rr.dr.d_type == QType::RRSIG) // RRSIGS are added later any way. continue; // TODO: this actually means addRRSig should check if the RRSig is already there - // cerr<<"Auth: "<qtype)<<", "<qtype.getCode() == QType::ANY || rr.dr.d_type == p->qtype.getCode()) && rr.auth) + // cerr<<"Auth: "<qtype.getCode() && !rr.auth) || (rr.dr.d_type == QType::NS && (!rr.auth || !(sd.qname==rr.dr.d_name)))) + if((rr.dr.d_type == p.qtype.getCode() && !rr.auth) || (rr.dr.d_type == QType::NS && (!rr.auth || !(sd.qname==rr.dr.d_name)))) weHaveUnauth=1; - if(rr.dr.d_type == QType::CNAME && p->qtype.getCode() != QType::CNAME) + if(rr.dr.d_type == QType::CNAME && p.qtype.getCode() != QType::CNAME) weRedirected=1; - if(DP && rr.dr.d_type == QType::ALIAS && (p->qtype.getCode() == QType::A || p->qtype.getCode() == QType::AAAA || p->qtype.getCode() == QType::ANY)) { + if(DP && rr.dr.d_type == QType::ALIAS && (p.qtype.getCode() == QType::A || p.qtype.getCode() == QType::AAAA || p.qtype.getCode() == QType::ANY)) { if (!d_doExpandALIAS) { g_log<qtype.getCode() == QType::DS && weHaveUnauth && !weDone && !weRedirected) { + if(p.qtype.getCode() == QType::DS && weHaveUnauth && !weDone && !weRedirected) { DLOG(g_log<<"Q for DS of a name for which we do have NS, but for which we don't have DS; need to provide an AUTH answer that shows we don't"<qtype.getCode() == QType::ANY)) { + if(!haveAlias.empty() && (!weDone || p.qtype.getCode() == QType::ANY)) { DLOG(g_log<completePacket(r, haveAlias, target, aliasScopeMask); return 0; @@ -1422,7 +1420,7 @@ DNSPacket *PacketHandler::doQuestion(DNSPacket *p) // referral for DS query - if(p->qtype.getCode() == QType::DS) { + if(p.qtype.getCode() == QType::DS) { DLOG(g_log<<"Qtype is DS"<qtype.getCode() == QType::CNAME) || (p->qtype.getCode() == QType::ANY)) && retargetcount > 0)) + if (!(((p.qtype.getCode() == QType::CNAME) || (p.qtype.getCode() == QType::ANY)) && retargetcount > 0)) makeNXDomain(p, r, target, wildcard, sd); } @@ -1501,14 +1499,14 @@ DNSPacket *PacketHandler::doQuestion(DNSPacket *p) if(loopRR.dr.d_type == QType::LUA) continue; #endif - if((p->qtype.getCode() == QType::ANY || loopRR.dr.d_type == p->qtype.getCode()) && loopRR.dr.d_type && loopRR.dr.d_type != QType::ALIAS && loopRR.auth) { + if((p.qtype.getCode() == QType::ANY || loopRR.dr.d_type == p.qtype.getCode()) && loopRR.dr.d_type && loopRR.dr.d_type != QType::ALIAS && loopRR.auth) { r->addRecord(loopRR); haveRecords = true; } } if (haveRecords) { - if(d_dnssec && p->qtype.getCode() == QType::ANY) + if(d_dnssec && p.qtype.getCode() == QType::ANY) completeANYRecords(p, r, sd, target); } else @@ -1522,9 +1520,9 @@ DNSPacket *PacketHandler::doQuestion(DNSPacket *p) goto sendit; // check whether this could be fixed easily // if (*(rr.dr.d_name.rbegin()) == '.') { - // g_log<qdomain<<"|"<qtype.getCode()<<"): you have a trailing dot, this could be the problem (or run pdnsutil rectify-zone " <qdomain<<"|"<qtype.getCode()<<"): please run pdnsutil rectify-zone "<getRRS()); - if(PC.enabled() && !noCache && p->couldBeCached()) - PC.insert(p, r, r->getMinTTL()); // in the packet cache + if(PC.enabled() && !noCache && p.couldBeCached()) + PC.insert(p, *r, r->getMinTTL()); // in the packet cache } - catch(DBException &e) { + catch(const DBException &e) { g_log<replyPacket(); // generate an empty reply packet + r=p.replyPacket(); // generate an empty reply packet r->setRcode(RCode::ServFail); S.inc("servfail-packets"); - S.ringAccount("servfail-queries", p->qdomain, p->qtype); + S.ringAccount("servfail-queries", p.qdomain, p.qtype); } - catch(PDNSException &e) { + catch(const PDNSException &e) { g_log<qdomain<<"/"<qtype.getName()<<" ("<replyPacket(); // generate an empty reply packet + catch(const std::exception &e) { + g_log<setRcode(RCode::ServFail); S.inc("servfail-packets"); - S.ringAccount("servfail-queries", p->qdomain, p->qtype); + S.ringAccount("servfail-queries", p.qdomain, p.qtype); } return r; diff --git a/pdns/packethandler.hh b/pdns/packethandler.hh index b5bdfc762ccb..2b9cd6144a3b 100644 --- a/pdns/packethandler.hh +++ b/pdns/packethandler.hh @@ -55,53 +55,53 @@ class NSEC3PARAMRecordContent; class PacketHandler { public: - DNSPacket *doQuestion(DNSPacket *); //!< hand us a DNS packet with a question, we give you an answer - DNSPacket *question(DNSPacket *); //!< hand us a DNS packet with a question, we give you an answer + std::unique_ptr doQuestion(DNSPacket&); //!< hand us a DNS packet with a question, we give you an answer + std::unique_ptr question(DNSPacket&); //!< hand us a DNS packet with a question, we give you an answer PacketHandler(); ~PacketHandler(); // defined in packethandler.cc, and does --count static int numRunning(){return s_count;}; //!< Returns the number of running PacketHandlers. Called by Distributor UeberBackend *getBackend(); - int trySuperMasterSynchronous(const DNSPacket *p, const DNSName& tsigkeyname); + int trySuperMasterSynchronous(const DNSPacket& p, const DNSName& tsigkeyname); static NetmaskGroup s_allowNotifyFrom; static set s_forwardNotify; private: - int trySuperMaster(DNSPacket *p, const DNSName& tsigkeyname); - int processNotify(DNSPacket *); - void addRootReferral(DNSPacket *r); - int doChaosRequest(DNSPacket *p, DNSPacket *r, DNSName &target); - bool addDNSKEY(DNSPacket *p, DNSPacket *r, const SOAData& sd); - bool addCDNSKEY(DNSPacket *p, DNSPacket *r, const SOAData& sd); - bool addCDS(DNSPacket *p, DNSPacket *r, const SOAData& sd); - bool addNSEC3PARAM(DNSPacket *p, DNSPacket *r, const SOAData& sd); - int doAdditionalProcessingAndDropAA(DNSPacket *p, DNSPacket *r, const SOAData& sd, bool retargeted); - void addNSECX(DNSPacket *p, DNSPacket* r, const DNSName &target, const DNSName &wildcard, const DNSName &auth, int mode); - void addNSEC(DNSPacket *p, DNSPacket* r, const DNSName &target, const DNSName &wildcard, const DNSName& auth, int mode); - void addNSEC3(DNSPacket *p, DNSPacket* r, const DNSName &target, const DNSName &wildcard, const DNSName& auth, const NSEC3PARAMRecordContent& nsec3param, bool narrow, int mode); - void emitNSEC(DNSPacket *r, const SOAData& sd, const DNSName& name, const DNSName& next, int mode); - void emitNSEC3(DNSPacket *r, const SOAData& sd, const NSEC3PARAMRecordContent &ns3rc, const DNSName& unhashed, const string& begin, const string& end, int mode); - int processUpdate(DNSPacket *p); - int forwardPacket(const string &msgPrefix, DNSPacket *p, DomainInfo *di); + int trySuperMaster(const DNSPacket& p, const DNSName& tsigkeyname); + int processNotify(const DNSPacket& ); + void addRootReferral(DNSPacket& r); + int doChaosRequest(const DNSPacket& p, std::unique_ptr& r, DNSName &target) const; + bool addDNSKEY(DNSPacket& p, std::unique_ptr& r, const SOAData& sd); + bool addCDNSKEY(DNSPacket& p, std::unique_ptr& r, const SOAData& sd); + bool addCDS(DNSPacket& p, std::unique_ptr& r, const SOAData& sd); + bool addNSEC3PARAM(const DNSPacket& p, std::unique_ptr& r, const SOAData& sd); + int doAdditionalProcessingAndDropAA(DNSPacket& p, std::unique_ptr& r, const SOAData& sd, bool retargeted); + void addNSECX(DNSPacket& p, std::unique_ptr& r, const DNSName &target, const DNSName &wildcard, const DNSName &auth, int mode); + void addNSEC(DNSPacket& p, std::unique_ptr& r, const DNSName &target, const DNSName &wildcard, const DNSName& auth, int mode); + void addNSEC3(DNSPacket& p, std::unique_ptr& r, const DNSName &target, const DNSName &wildcard, const DNSName& auth, const NSEC3PARAMRecordContent& nsec3param, bool narrow, int mode); + void emitNSEC(std::unique_ptr& r, const SOAData& sd, const DNSName& name, const DNSName& next, int mode); + void emitNSEC3(std::unique_ptr& r, const SOAData& sd, const NSEC3PARAMRecordContent &ns3rc, const DNSName& unhashed, const string& begin, const string& end, int mode); + int processUpdate(DNSPacket& p); + int forwardPacket(const string &msgPrefix, const DNSPacket& p, const DomainInfo& di); uint performUpdate(const string &msgPrefix, const DNSRecord *rr, DomainInfo *di, bool isPresigned, bool* narrow, bool* haveNSEC3, NSEC3PARAMRecordContent *ns3pr, bool *updatedSerial); int checkUpdatePrescan(const DNSRecord *rr); int checkUpdatePrerequisites(const DNSRecord *rr, DomainInfo *di); void increaseSerial(const string &msgPrefix, const DomainInfo *di, bool haveNSEC3, bool narrow, const NSEC3PARAMRecordContent *ns3pr); - void makeNXDomain(DNSPacket* p, DNSPacket* r, const DNSName& target, const DNSName& wildcard, const SOAData& sd); - void makeNOError(DNSPacket* p, DNSPacket* r, const DNSName& target, const DNSName& wildcard, const SOAData& sd, int mode); - vector getBestReferralNS(DNSPacket *p, SOAData& sd, const DNSName &target); - vector getBestDNAMESynth(DNSPacket *p, SOAData& sd, DNSName &target); - bool tryDNAME(DNSPacket *p, DNSPacket*r, SOAData& sd, DNSName &target); - bool tryReferral(DNSPacket *p, DNSPacket*r, SOAData& sd, const DNSName &target, bool retargeted); + void makeNXDomain(DNSPacket& p, std::unique_ptr& r, const DNSName& target, const DNSName& wildcard, const SOAData& sd); + void makeNOError(DNSPacket& p, std::unique_ptr& r, const DNSName& target, const DNSName& wildcard, const SOAData& sd, int mode); + vector getBestReferralNS(DNSPacket& p, const SOAData& sd, const DNSName &target); + vector getBestDNAMESynth(DNSPacket& p, const SOAData& sd, DNSName &target); + bool tryDNAME(DNSPacket& p, std::unique_ptr& r, const SOAData& sd, DNSName &target); + bool tryReferral(DNSPacket& p, std::unique_ptr& r, const SOAData& sd, const DNSName &target, bool retargeted); - bool getBestWildcard(DNSPacket *p, SOAData& sd, const DNSName &target, DNSName &wildcard, vector* ret); - bool tryWildcard(DNSPacket *p, DNSPacket*r, SOAData& sd, DNSName &target, DNSName &wildcard, bool& retargeted, bool& nodata); - bool addDSforNS(DNSPacket* p, DNSPacket* r, SOAData& sd, const DNSName& dsname); - void completeANYRecords(DNSPacket *p, DNSPacket*r, SOAData& sd, const DNSName &target); + bool getBestWildcard(DNSPacket& p, const SOAData& sd, const DNSName &target, DNSName &wildcard, vector* ret); + bool tryWildcard(DNSPacket& p, std::unique_ptr& r, const SOAData& sd, DNSName &target, DNSName &wildcard, bool& retargeted, bool& nodata); + bool addDSforNS(DNSPacket& p, std::unique_ptr& r, const SOAData& sd, const DNSName& dsname); + void completeANYRecords(DNSPacket& p, std::unique_ptr& r, const SOAData& sd, const DNSName &target); - void tkeyHandler(DNSPacket *p, DNSPacket *r); //& r); // makeSOAContent(const SOAData& sd); #endif /* PACKETHANDLER */ diff --git a/pdns/pkcs11signers.cc b/pdns/pkcs11signers.cc index ebc51c6a40e4..231ad9afb0bc 100644 --- a/pdns/pkcs11signers.cc +++ b/pdns/pkcs11signers.cc @@ -70,11 +70,10 @@ class P11KitAttribute { CK_ULONG ckLong; std::string ckString; CkaValueType ckType; - unsigned char *buffer; + std::unique_ptr buffer; CK_ULONG buflen; protected: void Init() { - buffer = NULL; buflen = 0; }; public: @@ -141,18 +140,17 @@ class P11KitAttribute { // this bit is used for getting attribute from object // we provide a pointer for GetAttributeValue to write to CK_BYTE_PTR allocate(CK_ULONG amount) { - buffer = new unsigned char[amount]; + buffer = std::unique_ptr(new unsigned char[amount]); buflen = amount; - return buffer; + return buffer.get(); } // and here we copy the results back and delete buffer void commit(CK_ULONG amount) { if (buffer) { - this->ckString.assign((char*)buffer, amount); - delete [] buffer; + this->ckString.assign((char*)buffer.get(), amount); } - buffer = NULL; + buffer.reset(); buflen = 0; } @@ -171,7 +169,7 @@ class P11KitAttribute { break; } case Attribute_String: { - attr->pValue = buffer; + attr->pValue = buffer.get(); attr->ulValueLen = buflen; } }; @@ -218,10 +216,10 @@ class Pkcs11Slot { public: Pkcs11Slot(CK_FUNCTION_LIST* functions, const CK_SLOT_ID& slot) : - d_slot(slot), - d_functions(functions), - d_err(0), - d_logged_in(false) + d_logged_in(false), + d_functions(functions), + d_slot(slot), + d_err(0) { CK_TOKEN_INFO tokenInfo; pthread_mutex_init(&(this->d_m), NULL); @@ -243,11 +241,10 @@ class Pkcs11Slot { bool Login(const std::string& pin) { if (d_logged_in) return true; - unsigned char *uPin = new unsigned char[pin.size()]; - memcpy(uPin, pin.c_str(), pin.size()); - d_err = d_functions->C_Login(this->d_session, CKU_USER, uPin, pin.size()); - memset(uPin, 0, pin.size()); - delete [] uPin; + std::unique_ptr uPin(new unsigned char[pin.size()]); + memcpy(uPin.get(), pin.c_str(), pin.size()); + d_err = d_functions->C_Login(this->d_session, CKU_USER, uPin.get(), pin.size()); + memset(uPin.get(), 0, pin.size()); logError("C_Login"); if (d_err == 0) { @@ -300,20 +297,18 @@ class Pkcs11Token { // if we can use some library to parse the EC parameters, better use it. // otherwise fall back to using hardcoded primev256 and secp384r1 #ifdef HAVE_LIBCRYPTO_ECDSA - EC_KEY *key = NULL; - BIGNUM *order; unsigned int bits = 0; const unsigned char *in = reinterpret_cast(obj.c_str()); - order = BN_new(); - if ((key = d2i_ECParameters(NULL, &in, obj.size())) != NULL && - EC_GROUP_get_order(EC_KEY_get0_group(key), order, NULL) == 1) { - bits = BN_num_bits(order); + auto order = std::unique_ptr(BN_new(), BN_clear_free); + auto tempKey = d2i_ECParameters(nullptr, &in, obj.size()); + if (tempKey != nullptr) { + auto key = std::unique_ptr(tempKey, EC_KEY_free); + tempKey = nullptr; + if (EC_GROUP_get_order(EC_KEY_get0_group(key.get()), order.get(), nullptr) == 1) { + bits = BN_num_bits(order.get()); + } } - BN_free(order); - if (key != NULL) - EC_KEY_free(key); - if (bits == 0) throw PDNSException("Unsupported EC key"); @@ -414,26 +409,23 @@ class Pkcs11Token { Lock l(d_slot->m()); size_t k; - CK_ATTRIBUTE_PTR pubAttr, privAttr; - pubAttr = new CK_ATTRIBUTE[pubAttributes.size()]; - privAttr = new CK_ATTRIBUTE[privAttributes.size()]; + std::unique_ptr pubAttr(new CK_ATTRIBUTE[pubAttributes.size()]); + std::unique_ptr privAttr(new CK_ATTRIBUTE[privAttributes.size()]); k = 0; for(P11KitAttribute& attribute : pubAttributes) { - attribute.rattr(pubAttr+k); + attribute.rattr(pubAttr.get()+k); k++; } k = 0; for(P11KitAttribute& attribute : privAttributes) { - attribute.rattr(privAttr+k); + attribute.rattr(privAttr.get()+k); k++; } - d_err = this->d_slot->f()->C_GenerateKeyPair(d_slot->Session(), mechanism, pubAttr, pubAttributes.size(), privAttr, privAttributes.size(), pubKey, privKey); + d_err = this->d_slot->f()->C_GenerateKeyPair(d_slot->Session(), mechanism, pubAttr.get(), pubAttributes.size(), privAttr.get(), privAttributes.size(), pubKey, privKey); logError("C_GenerateKeyPair"); - delete [] pubAttr; - delete [] privAttr; } if (d_err == 0) LoadAttributes(); @@ -537,41 +529,35 @@ class Pkcs11Token { size_t k; unsigned long count; - CK_ATTRIBUTE_PTR attr; - CK_OBJECT_HANDLE_PTR handles = new CK_OBJECT_HANDLE[maxobjects]; - attr = new CK_ATTRIBUTE[attributes.size()]; + std::unique_ptr handles(new CK_OBJECT_HANDLE[maxobjects]); + std::unique_ptr attr(new CK_ATTRIBUTE[attributes.size()]); k = 0; for(const P11KitAttribute& attribute : attributes) { - attribute.rattr(attr+k); + attribute.rattr(attr.get()+k); k++; } // perform search - d_err = this->d_slot->f()->C_FindObjectsInit(d_slot->Session(), attr, k); + d_err = this->d_slot->f()->C_FindObjectsInit(d_slot->Session(), attr.get(), k); if (d_err) { - delete [] attr; - delete [] handles; logError("C_FindObjectsInit"); return d_err; } count = maxobjects; - rv = d_err = this->d_slot->f()->C_FindObjects(d_slot->Session(), handles, maxobjects, &count); + rv = d_err = this->d_slot->f()->C_FindObjects(d_slot->Session(), handles.get(), maxobjects, &count); objects.clear(); if (!rv) { for(k=0;kd_slot->f()->C_FindObjectsFinal(d_slot->Session()); logError("C_FindObjectsFinal"); @@ -587,43 +573,39 @@ class Pkcs11Token { int GetAttributeValue2(const CK_OBJECT_HANDLE& object, std::vector& attributes) { size_t k; - CK_ATTRIBUTE_PTR attr; - attr = new CK_ATTRIBUTE[attributes.size()]; + std::unique_ptr attr(new CK_ATTRIBUTE[attributes.size()]); k = 0; for(P11KitAttribute &attribute : attributes) { - attribute.wattr(attr+k); + attribute.wattr(attr.get()+k); k++; } // round 1 - get attribute sizes - d_err = d_slot->f()->C_GetAttributeValue(d_slot->Session(), object, attr, attributes.size()); + d_err = d_slot->f()->C_GetAttributeValue(d_slot->Session(), object, attr.get(), attributes.size()); logError("C_GetAttributeValue"); if (d_err) { - delete [] attr; return d_err; } // then allocate memory for(size_t idx=0; idx < attributes.size(); idx++) { if (attributes[idx].valueType() == Attribute_String) { - attr[idx].pValue = attributes[idx].allocate(attr[idx].ulValueLen); + (attr.get())[idx].pValue = attributes[idx].allocate((attr.get())[idx].ulValueLen); } } // round 2 - get actual values - d_err = d_slot->f()->C_GetAttributeValue(d_slot->Session(), object, attr, attributes.size()); + d_err = d_slot->f()->C_GetAttributeValue(d_slot->Session(), object, attr.get(), attributes.size()); logError("C_GetAttributeValue"); // copy values to map and release allocated memory for(size_t idx=0; idx < attributes.size(); idx++) { if (attributes[idx].valueType() == Attribute_String) { - attributes[idx].commit(attr[idx].ulValueLen); + attributes[idx].commit((attr.get())[idx].ulValueLen); } } - delete [] attr; - return d_err; }; @@ -770,12 +752,12 @@ std::shared_ptr Pkcs11Token::GetToken(const std::string& module, co } Pkcs11Token::Pkcs11Token(const std::shared_ptr& slot, const std::string& label, const std::string& pub_label) : - d_bits(0), d_slot(slot), + d_bits(0), d_label(label), d_pub_label(pub_label), - d_err(0), - d_loaded(false) + d_loaded(false), + d_err(0) { // open a session if (this->d_slot->LoggedIn()) LoadAttributes(); diff --git a/pdns/receiver.cc b/pdns/receiver.cc index 989993333359..3caf56e49322 100644 --- a/pdns/receiver.cc +++ b/pdns/receiver.cc @@ -541,15 +541,15 @@ int main(int argc, char **argv) if(isGuarded(argv)) { g_log<(); // listens on stdin } else { g_log<(); else - dl=new DynListener(s_programname); + dl=std::unique_ptr(new DynListener(s_programname)); writePid(); } diff --git a/pdns/rfc2136handler.cc b/pdns/rfc2136handler.cc index 778dc8558ab8..03b3856bf018 100644 --- a/pdns/rfc2136handler.cc +++ b/pdns/rfc2136handler.cc @@ -576,16 +576,16 @@ uint PacketHandler::performUpdate(const string &msgPrefix, const DNSRecord *rr, return changedRecords; } -int PacketHandler::forwardPacket(const string &msgPrefix, DNSPacket *p, DomainInfo *di) { +int PacketHandler::forwardPacket(const string &msgPrefix, const DNSPacket& p, const DomainInfo& di) { vector forward; - B.getDomainMetadata(p->qdomain, "FORWARD-DNSUPDATE", forward); + B.getDomainMetadata(p.qdomain, "FORWARD-DNSUPDATE", forward); if (forward.size() == 0 && ! ::arg().mustDo("forward-dnsupdate")) { g_log<masters) { + for(const auto& remote : di.masters) { g_log<d.id) + ") from " + p->getRemote().toString() + " for " + p->qdomain.toLogString() + ": "; + string msgPrefix="UPDATE (" + itoa(p.d.id) + ") from " + p.getRemote().toString() + " for " + p.qdomain.toLogString() + ": "; g_log< allowedRanges; - B.getDomainMetadata(p->qdomain, "ALLOW-DNSUPDATE-FROM", allowedRanges); + B.getDomainMetadata(p.qdomain, "ALLOW-DNSUPDATE-FROM", allowedRanges); if (! ::arg()["allow-dnsupdate-from"].empty()) stringtok(allowedRanges, ::arg()["allow-dnsupdate-from"], ", \t" ); @@ -722,7 +722,7 @@ int PacketHandler::processUpdate(DNSPacket *p) { ng.addMask(i); } - if ( ! ng.match(&p->d_remote)) { + if ( ! ng.match(&p.d_remote)) { g_log< tsigKeys; - B.getDomainMetadata(p->qdomain, "TSIG-ALLOW-DNSUPDATE", tsigKeys); + B.getDomainMetadata(p.qdomain, "TSIG-ALLOW-DNSUPDATE", tsigKeys); if (tsigKeys.size() > 0) { bool validKey = false; TSIGRecordContent trc; DNSName inputkey; string message; - if (! p->getTSIGDetails(&trc, &inputkey)) { + if (! p.getTSIGDetails(&trc, &inputkey)) { g_log<d_tsig_algo == TSIG_GSS) { - GssName inputname(p->d_peer_principal); // match against principal since GSS + if (p.d_tsig_algo == TSIG_GSS) { + GssName inputname(p.d_peer_principal); // match against principal since GSS for(const auto& key: tsigKeys) { if (inputname.match(key)) { validKey = true; @@ -765,7 +765,7 @@ int PacketHandler::processUpdate(DNSPacket *p) { } } - if (tsigKeys.size() == 0 && p->d_havetsig) + if (tsigKeys.size() == 0 && p.d_havetsig) g_log<getString()); + MOADNSParser mdp(false, p.getString()); if (mdp.d_header.qdcount != 1) { g_log<qtype.getCode() != QType::SOA) { // RFC2136 2.3 - ZTYPE must be SOA + if (p.qtype.getCode() != QType::SOA) { // RFC2136 2.3 - ZTYPE must be SOA g_log<qclass != QClass::IN) { + if (p.qclass != QClass::IN) { g_log<qdomain, di) || !di.backend) { - g_log<qdomain<<"' (or backend does not support DNS update operation)"<startTransaction(p->qdomain, -1)) { // Not giving the domain_id means that we do not delete the existing records. - g_log<qdomain<<" does not support transaction. Can't do Update packet."<startTransaction(p.qdomain, -1)) { // Not giving the domain_id means that we do not delete the existing records. + g_log< notify; - B.getDomainMetadata(p->qdomain, "NOTIFY-DNSUPDATE", notify); + B.getDomainMetadata(p.qdomain, "NOTIFY-DNSUPDATE", notify); if (!notify.empty() && notify.front() == "1") { Communicator.notifyDomain(di.zone, &B); } diff --git a/pdns/saxfr.cc b/pdns/saxfr.cc index 8d0ddab45210..1a48cfac7be4 100644 --- a/pdns/saxfr.cc +++ b/pdns/saxfr.cc @@ -128,17 +128,17 @@ try throw PDNSException("tcp read failed"); len=ntohs(len); - char *creply = new char[len]; + std::unique_ptr creply(new char[len]); int n=0; int numread; while(n creply(new char[len]); int n=0; int numread; while(n creply(new char[len]); int n=0; int numread; while(n(); d_chunks.push_back(vector()); // load an empty chunk if(!d_mustSign) @@ -81,8 +81,6 @@ ChunkedSigningPipe::ChunkedSigningPipe(const DNSName& signerName, bool mustSign, ChunkedSigningPipe::~ChunkedSigningPipe() { - delete d_rrsetToSign; - if(!d_mustSign) return; @@ -159,20 +157,19 @@ pair, vector > ChunkedSigningPipe::waitForRW(bool rd, bool wr, return vects; } -void ChunkedSigningPipe::addSignedToChunks(chunk_t* signedChunk) +void ChunkedSigningPipe::addSignedToChunks(std::unique_ptr& signedChunk) { chunk_t::const_iterator from = signedChunk->begin(); while(from != signedChunk->end()) { chunk_t& fillChunk = d_chunks.back(); - chunk_t::size_type room = d_maxchunkrecords - fillChunk.size(); unsigned int fit = std::min(room, (chunk_t::size_type)(signedChunk->end() - from)); d_chunks.back().insert(fillChunk.end(), from , from + fit); from+=fit; - + if(from != signedChunk->end()) // it didn't fit, so add a new chunk d_chunks.push_back(chunk_t()); } @@ -200,8 +197,9 @@ void ChunkedSigningPipe::sendRRSetToWorker() // it sounds so socialist! if(wantWrite && !rwVect.second.empty()) { random_shuffle(rwVect.second.begin(), rwVect.second.end()); // pick random available worker - writen2(*rwVect.second.begin(), &d_rrsetToSign, sizeof(d_rrsetToSign)); - d_rrsetToSign = new rrset_t; + auto ptr = d_rrsetToSign.release(); + writen2(*rwVect.second.begin(), &ptr, sizeof(ptr)); + d_rrsetToSign = make_unique(); d_outstandings[*rwVect.second.begin()]++; d_outstanding++; d_queued++; @@ -210,13 +208,12 @@ void ChunkedSigningPipe::sendRRSetToWorker() // it sounds so socialist! if(wantRead) { while(d_outstanding) { - chunk_t* chunk; - for(int fd : rwVect.first) { if(d_eof.count(fd)) continue; while(d_outstanding) { + chunk_t* chunk = nullptr; int res = readn(fd, &chunk, sizeof(chunk)); if(!res) { if (d_outstandings[fd] > 0) { @@ -231,13 +228,13 @@ void ChunkedSigningPipe::sendRRSetToWorker() // it sounds so socialist! else break; } - + + std::unique_ptr chunkPtr(chunk); + chunk = nullptr; --d_outstanding; d_outstandings[fd]--; - addSignedToChunks(chunk); - - delete chunk; + addSignedToChunks(chunkPtr); } } if(!d_outstanding || !d_final) @@ -249,8 +246,9 @@ void ChunkedSigningPipe::sendRRSetToWorker() // it sounds so socialist! if(wantWrite) { // our optimization above failed, we now wait synchronously rwVect = waitForRW(false, wantWrite, -1); // wait for something to happen random_shuffle(rwVect.second.begin(), rwVect.second.end()); // pick random available worker - writen2(*rwVect.second.begin(), &d_rrsetToSign, sizeof(d_rrsetToSign)); - d_rrsetToSign = new rrset_t; + auto ptr = d_rrsetToSign.release(); + writen2(*rwVect.second.begin(), &ptr, sizeof(ptr)); + d_rrsetToSign = make_unique(); d_outstandings[*rwVect.second.begin()]++; d_outstanding++; d_queued++; diff --git a/pdns/signingpipe.hh b/pdns/signingpipe.hh index 06b53b67783b..e776031049b7 100644 --- a/pdns/signingpipe.hh +++ b/pdns/signingpipe.hh @@ -57,7 +57,7 @@ private: void flushToSign(); void dedupRRSet(); void sendRRSetToWorker(); // dispatch RRSET to worker - void addSignedToChunks(chunk_t* signedChunk); + void addSignedToChunks(std::unique_ptr& signedChunk); pair, vector > waitForRW(bool rd, bool wr, int seconds); static void* helperWorker(ChunkedSigningPipe* csp, int fd); @@ -66,7 +66,7 @@ private: unsigned int d_numworkers; unsigned int d_submitted; - rrset_t* d_rrsetToSign; + std::unique_ptr d_rrsetToSign; std::deque< std::vector > d_chunks; DNSName d_signer; diff --git a/pdns/slavecommunicator.cc b/pdns/slavecommunicator.cc index 31ae46285fcc..5b68c286002a 100644 --- a/pdns/slavecommunicator.cc +++ b/pdns/slavecommunicator.cc @@ -46,8 +46,6 @@ #include "common_startup.hh" #include "ixfr.hh" -using boost::scoped_ptr; - void CommunicatorClass::addSuckRequest(const DNSName &domain, const ComboAddress& master) { @@ -80,7 +78,7 @@ struct ZoneStatus }; -void CommunicatorClass::ixfrSuck(const DNSName &domain, const TSIGTriplet& tt, const ComboAddress& laddr, const ComboAddress& remote, scoped_ptr& pdl, +void CommunicatorClass::ixfrSuck(const DNSName &domain, const TSIGTriplet& tt, const ComboAddress& laddr, const ComboAddress& remote, unique_ptr& pdl, ZoneStatus& zs, vector* axfr) { UeberBackend B; // fresh UeberBackend @@ -239,7 +237,7 @@ static bool processRecordForZS(const DNSName& domain, bool& firstNSEC3, DNSResou 5) It updates the Empty Non Terminals */ -static vector doAxfr(const ComboAddress& raddr, const DNSName& domain, const TSIGTriplet& tt, const ComboAddress& laddr, scoped_ptr& pdl, ZoneStatus& zs) +static vector doAxfr(const ComboAddress& raddr, const DNSName& domain, const TSIGTriplet& tt, const ComboAddress& laddr, unique_ptr& pdl, ZoneStatus& zs) { uint16_t axfr_timeout=::arg().asNum("axfr-fetch-timeout"); vector rrs; @@ -340,7 +338,7 @@ void CommunicatorClass::suck(const DNSName &domain, const ComboAddress& remote) } - scoped_ptr pdl; + unique_ptr pdl{nullptr}; vector scripts; string script=::arg()["lua-axfr-script"]; if(B.getDomainMetadata(domain, "LUA-AXFR-SCRIPT", scripts) && !scripts.empty()) { @@ -352,7 +350,7 @@ void CommunicatorClass::suck(const DNSName &domain, const ComboAddress& remote) } if(!script.empty()){ try { - pdl.reset(new AuthLua4()); + pdl = make_unique(); pdl->loadFile(script); g_log<trySuperMasterSynchronous(&dp, tsigkeyname); // FIXME could use some error loging + P->trySuperMasterSynchronous(dp, tsigkeyname); // FIXME could use some error loging } if(rdomains.empty()) { // if we have priority domains, check them first B->getUnfreshSlaveInfos(&rdomains); diff --git a/pdns/statbag.cc b/pdns/statbag.cc index 83af32c75178..be36420e10b6 100644 --- a/pdns/statbag.cc +++ b/pdns/statbag.cc @@ -99,8 +99,8 @@ string StatBag::getDescrip(const string &item) void StatBag::declare(const string &key, const string &descrip) { - AtomicCounter *i=new AtomicCounter(0); - d_stats[key]=i; + auto i=make_unique(0); + d_stats[key]=std::move(i); d_keyDescrips[key]=descrip; } @@ -153,15 +153,11 @@ string StatBag::getValueStrZero(const string &key) AtomicCounter *StatBag::getPointer(const string &key) { exists(key); - return d_stats[key]; + return d_stats[key].get(); } StatBag::~StatBag() { - for(const auto& i: d_stats) { - delete i.second; - } - } template diff --git a/pdns/statbag.hh b/pdns/statbag.hh index a9839693f26c..0992a0946d38 100644 --- a/pdns/statbag.hh +++ b/pdns/statbag.hh @@ -62,7 +62,7 @@ private: //! use this to gather and query statistics class StatBag { - map d_stats; + map> d_stats; map d_keyDescrips; map >d_rings; map >d_comborings; diff --git a/pdns/tcpreceiver.cc b/pdns/tcpreceiver.cc index e0fcda825254..a86d09cb9d0e 100644 --- a/pdns/tcpreceiver.cc +++ b/pdns/tcpreceiver.cc @@ -67,9 +67,9 @@ extern StatBag S; */ pthread_mutex_t TCPNameserver::s_plock = PTHREAD_MUTEX_INITIALIZER; -Semaphore *TCPNameserver::d_connectionroom_sem; +std::unique_ptr TCPNameserver::d_connectionroom_sem{nullptr}; +std::unique_ptr TCPNameserver::s_P{nullptr}; unsigned int TCPNameserver::d_maxTCPConnections = 0; -PacketHandler *TCPNameserver::s_P; NetmaskGroup TCPNameserver::d_ng; size_t TCPNameserver::d_maxTransactionsPerConn; size_t TCPNameserver::d_maxConnectionsPerClient; @@ -81,9 +81,9 @@ std::map TCPNameserver::s void TCPNameserver::go() { g_log<(); } catch(PDNSException &ae) { g_log< p, int outsock) +void TCPNameserver::sendPacket(std::unique_ptr& p, int outsock) { g_rs.submitResponse(*p, false); @@ -255,7 +255,7 @@ void TCPNameserver::decrementClientCount(const ComboAddress& remote) void *TCPNameserver::doConnection(void *data) { setThreadName("pdns/tcpConnect"); - shared_ptr packet; + std::unique_ptr packet; // Fix gcc-4.0 error (on AMD64) int fd=(int)(long)data; // gotta love C (generates a harmless warning on opteron) ComboAddress remote; @@ -328,7 +328,7 @@ void *TCPNameserver::doConnection(void *data) else S.inc("tcp4-queries"); - packet=shared_ptr(new DNSPacket(true)); + packet=make_unique(true); packet->setRemote(&remote); packet->d_tcp=true; packet->setSocket(fd); @@ -347,8 +347,8 @@ void *TCPNameserver::doConnection(void *data) continue; } - shared_ptr reply; - shared_ptr cached= shared_ptr(new DNSPacket(false)); + std::unique_ptr reply; + auto cached = make_unique(false); if(logDNSQueries) { string remote_text; if(packet->hasEDNSSubnet()) @@ -360,7 +360,7 @@ void *TCPNameserver::doConnection(void *data) } if(PC.enabled()) { - if(packet->couldBeCached() && PC.get(packet.get(), cached.get())) { // short circuit - does the PacketCache recognize this question? + if(packet->couldBeCached() && PC.get(*packet, *cached)) { // short circuit - does the PacketCache recognize this question? if(logDNSQueries) g_log<<"packetcache HIT"<setRemote(&packet->d_remote); @@ -378,10 +378,10 @@ void *TCPNameserver::doConnection(void *data) Lock l(&s_plock); if(!s_P) { g_log<(); } - reply=shared_ptr(s_P->doQuestion(packet.get())); // we really need to ask the backend :-) + reply= s_P->doQuestion(*packet); // we really need to ask the backend :-) } if(!reply) // unable to write an answer? @@ -392,8 +392,7 @@ void *TCPNameserver::doConnection(void *data) } catch(PDNSException &ae) { Lock l(&s_plock); - delete s_P; - s_P = 0; // on next call, backend will be recycled + s_P.reset(); // on next call, backend will be recycled g_log< q) +bool TCPNameserver::canDoAXFR(std::unique_ptr& q) { if(::arg().mustDo("disable-axfr")) return false; @@ -539,9 +538,9 @@ namespace { bool d_auth; }; - shared_ptr getFreshAXFRPacket(shared_ptr q) + std::unique_ptr getFreshAXFRPacket(std::unique_ptr& q) { - shared_ptr ret = shared_ptr(q->replyPacket()); + std::unique_ptr ret = std::unique_ptr(q->replyPacket()); ret->setCompress(false); ret->d_dnssecOk=false; // RFC 5936, 2.2.5 ret->d_tcp = true; @@ -551,9 +550,9 @@ namespace { /** do the actual zone transfer. Return 0 in case of error, 1 in case of success */ -int TCPNameserver::doAXFR(const DNSName &target, shared_ptr q, int outsock) +int TCPNameserver::doAXFR(const DNSName &target, std::unique_ptr& q, int outsock) { - shared_ptr outpacket= getFreshAXFRPacket(q); + std::unique_ptr outpacket= getFreshAXFRPacket(q); if(q->d_dnssecOk) outpacket->d_dnssecOk=true; // RFC 5936, 2.2.5 'SHOULD' @@ -566,7 +565,7 @@ int TCPNameserver::doAXFR(const DNSName &target, shared_ptr q, int ou DLOG(g_log<<"Looking for SOA"<(); } // canDoAXFR does all the ACL checks, and has the if(disable-axfr) shortcut, call it first. @@ -1049,9 +1048,9 @@ int TCPNameserver::doAXFR(const DNSName &target, shared_ptr q, int ou return 1; } -int TCPNameserver::doIXFR(shared_ptr q, int outsock) +int TCPNameserver::doIXFR(std::unique_ptr& q, int outsock) { - shared_ptr outpacket=getFreshAXFRPacket(q); + std::unique_ptr outpacket=getFreshAXFRPacket(q); if(q->d_dnssecOk) outpacket->d_dnssecOk=true; // RFC 5936, 2.2.5 'SHOULD' @@ -1095,7 +1094,7 @@ int TCPNameserver::doIXFR(shared_ptr q, int outsock) DLOG(g_log<<"Looking for SOA"<(); } // canDoAXFR does all the ACL checks, and has the if(disable-axfr) shortcut, call it first. @@ -1184,7 +1183,6 @@ int TCPNameserver::doIXFR(shared_ptr q, int outsock) TCPNameserver::~TCPNameserver() { - delete d_connectionroom_sem; } TCPNameserver::TCPNameserver() @@ -1195,7 +1193,7 @@ TCPNameserver::TCPNameserver() d_maxConnectionsPerClient = ::arg().asNum("max-tcp-connections-per-client"); // sem_init(&d_connectionroom_sem,0,::arg().asNum("max-tcp-connections")); - d_connectionroom_sem = new Semaphore( ::arg().asNum( "max-tcp-connections" )); + d_connectionroom_sem = make_unique( ::arg().asNum( "max-tcp-connections" )); d_maxTCPConnections = ::arg().asNum( "max-tcp-connections" ); d_tid=0; vectorlocals; diff --git a/pdns/tcpreceiver.hh b/pdns/tcpreceiver.hh index fd8b33c22f8a..87c7d0f71b09 100644 --- a/pdns/tcpreceiver.hh +++ b/pdns/tcpreceiver.hh @@ -50,12 +50,12 @@ public: unsigned int numTCPConnections(); private: - static void sendPacket(std::shared_ptr p, int outsock); + static void sendPacket(std::unique_ptr& p, int outsock); static int readLength(int fd, ComboAddress *remote); static void getQuestion(int fd, char *mesg, int pktlen, const ComboAddress& remote, unsigned int totalTime); - static int doAXFR(const DNSName &target, std::shared_ptr q, int outsock); - static int doIXFR(std::shared_ptr q, int outsock); - static bool canDoAXFR(std::shared_ptr q); + static int doAXFR(const DNSName &target, std::unique_ptr& q, int outsock); + static int doIXFR(std::unique_ptr& q, int outsock); + static bool canDoAXFR(std::unique_ptr& q); static void *doConnection(void *data); static void *launcher(void *data); static void decrementClientCount(const ComboAddress& remote); @@ -63,9 +63,9 @@ private: static pthread_mutex_t s_plock; static std::mutex s_clientsCountMutex; static std::map s_clientsCount; - static PacketHandler *s_P; + static std::unique_ptr s_P; pthread_t d_tid; - static Semaphore *d_connectionroom_sem; + static std::unique_ptr d_connectionroom_sem; static unsigned int d_maxTCPConnections; static NetmaskGroup d_ng; static size_t d_maxTransactionsPerConn; diff --git a/pdns/test-distributor_hh.cc b/pdns/test-distributor_hh.cc index 5f12ecd33ee2..d05131d88f87 100644 --- a/pdns/test-distributor_hh.cc +++ b/pdns/test-distributor_hh.cc @@ -18,24 +18,23 @@ struct Question DTime d_dt; DNSName qdomain; QType qtype; - DNSPacket* replyPacket() + std::unique_ptr replyPacket() { - return new DNSPacket(false); + return make_unique(false); } }; struct Backend { - DNSPacket* question(Question*) + std::unique_ptr question(Question&) { - return new DNSPacket(true); + return make_unique(true); } }; static std::atomic g_receivedAnswers; -static void report(DNSPacket* A) +static void report(std::unique_ptr& A) { - delete A; g_receivedAnswers++; } @@ -50,8 +49,8 @@ BOOST_AUTO_TEST_CASE(test_distributor_basic) { int n; for(n=0; n < 100; ++n) { - auto q = new Question(); - q->d_dt.set(); + Question q; + q.d_dt.set(); d->question(q, report); } sleep(1); @@ -60,17 +59,16 @@ BOOST_AUTO_TEST_CASE(test_distributor_basic) { struct BackendSlow { - DNSPacket* question(Question*) + std::unique_ptr question(Question&) { sleep(1); - return new DNSPacket(true); + return make_unique(true); } }; static std::atomic g_receivedAnswers1; -static void report1(DNSPacket* A) +static void report1(std::unique_ptr& A) { - delete A; g_receivedAnswers1++; } @@ -87,8 +85,8 @@ BOOST_AUTO_TEST_CASE(test_distributor_queue) { int n; // bound should be higher than max-queue-length for(n=0; n < 2000; ++n) { - auto q = new Question(); - q->d_dt.set(); + Question q; + q.d_dt.set(); d->question(q, report1); } }, DistributorFatal, [](DistributorFatal) { return true; }); @@ -103,14 +101,14 @@ struct BackendDies ~BackendDies() { } - DNSPacket* question(Question* q) + std::unique_ptr question(Question& q) { // cout<<"Q: "<qdomain<(true); } static std::atomic s_count; int d_count{0}; @@ -121,9 +119,8 @@ std::atomic BackendDies::s_count; std::atomic g_receivedAnswers2; -static void report2(DNSPacket* A) +static void report2(std::unique_ptr& A) { - delete A; g_receivedAnswers2++; } @@ -139,10 +136,10 @@ BOOST_AUTO_TEST_CASE(test_distributor_dies) { try { for(int n=0; n < 100; ++n) { - auto q = new Question(); - q->d_dt.set(); - q->qdomain=DNSName(std::to_string(n)); - q->qtype = QType(QType::A); + Question q; + q.d_dt.set(); + q.qdomain=DNSName(std::to_string(n)); + q.qtype = QType(QType::A); d->question(q, report2); } diff --git a/pdns/test-dnsrecords_cc.cc b/pdns/test-dnsrecords_cc.cc index 5e50111a3f1d..9cbedc1bab8e 100644 --- a/pdns/test-dnsrecords_cc.cc +++ b/pdns/test-dnsrecords_cc.cc @@ -7,7 +7,6 @@ #include #include -#include #include "base32.hh" #include "dnsrecords.hh" diff --git a/pdns/test-lock_hh.cc b/pdns/test-lock_hh.cc index 7f73d5e455da..abb813102e68 100644 --- a/pdns/test-lock_hh.cc +++ b/pdns/test-lock_hh.cc @@ -24,9 +24,9 @@ static void lthread() BOOST_AUTO_TEST_CASE(test_pdns_lock) { for(unsigned int n=0; n < 1000; ++n) { - auto p = new pthread_rwlock_t; - pthread_rwlock_init(p, 0); - g_locks.emplace_back(p); + auto p = make_unique(); + pthread_rwlock_init(p.get(), 0); + g_locks.emplace_back(std::move(p)); } std::vector rlocks; diff --git a/pdns/test-lua_auth4_cc.cc b/pdns/test-lua_auth4_cc.cc index 00ed0d729be0..7fdf4f1f4188 100644 --- a/pdns/test-lua_auth4_cc.cc +++ b/pdns/test-lua_auth4_cc.cc @@ -27,12 +27,13 @@ BOOST_AUTO_TEST_CASE(test_prequery) { " return false\n" "end"; AuthLua4 lua; - DNSPacket *p = new DNSPacket(true); - p->qdomain = DNSName("mod.unit.test."); + DNSPacket p(true); + p.qdomain = DNSName("mod.unit.test."); lua.loadString(script); - DNSPacket *r = nullptr; + std::unique_ptr r{nullptr}; try { r = lua.prequery(p); + BOOST_REQUIRE(r != nullptr); BOOST_CHECK_EQUAL(r->qdomain.toString(), "mod.unit.test."); } catch (const LuaContext::ExecutionErrorException& e) { try { @@ -41,8 +42,6 @@ BOOST_AUTO_TEST_CASE(test_prequery) { g_log<<"Extra info: "<setRemote(&ca); - p->d_peer_principal = "admin@DOMAIN"; + p.setRemote(&ca); + p.d_peer_principal = "admin@DOMAIN"; BOOST_CHECK_EQUAL(lua.updatePolicy(DNSName("mod.example.com."), QType(QType::A), DNSName("example.com."), p), true); - p->d_peer_principal = ""; + p.d_peer_principal = ""; BOOST_CHECK_EQUAL(lua.updatePolicy(DNSName("mod.example.com."), QType(QType::A), DNSName("example.com."), p), true); ca = ComboAddress(std::string("192.168.1.2")); - p->setRemote(&ca); + p.setRemote(&ca); BOOST_CHECK_EQUAL(lua.updatePolicy(DNSName("mod.example.com."), QType(QType::A), DNSName("example.com."), p), false); - delete p; } BOOST_AUTO_TEST_SUITE_END() diff --git a/pdns/test-packetcache_cc.cc b/pdns/test-packetcache_cc.cc index 60741ba572b0..f900f3d67759 100644 --- a/pdns/test-packetcache_cc.cc +++ b/pdns/test-packetcache_cc.cc @@ -164,7 +164,7 @@ try q.setHash(g_PC->canHashPacket(q.getString())); const unsigned int maxTTL = 3600; - g_PC->insert(&q, &r, maxTTL); + g_PC->insert(q, r, maxTTL); } return 0; @@ -188,7 +188,7 @@ try q.parse((char*)&pak[0], pak.size()); DNSPacket r(false); - if(!g_PC->get(&q, &r)) { + if(!g_PC->get(q, r)) { g_PCmissing++; } } @@ -378,85 +378,85 @@ BOOST_AUTO_TEST_CASE(test_AuthPacketCache) { } /* this call is required so the correct hash is set into q->d_hash */ - BOOST_CHECK_EQUAL(PC.get(&q, &r2), false); + BOOST_CHECK_EQUAL(PC.get(q, r2), false); - PC.insert(&q, &r, 3600); + PC.insert(q, r, 3600); BOOST_CHECK_EQUAL(PC.size(), 1); - BOOST_CHECK_EQUAL(PC.get(&q, &r2), true); + BOOST_CHECK_EQUAL(PC.get(q, r2), true); BOOST_CHECK_EQUAL(r2.qdomain, r.qdomain); /* different QID, still should match */ - BOOST_CHECK_EQUAL(PC.get(&differentIDQ, &r2), true); + BOOST_CHECK_EQUAL(PC.get(differentIDQ, r2), true); BOOST_CHECK_EQUAL(r2.qdomain, r.qdomain); /* with EDNS, should not match */ - BOOST_CHECK_EQUAL(PC.get(&ednsQ, &r2), false); + BOOST_CHECK_EQUAL(PC.get(ednsQ, r2), false); /* inserting the EDNS-enabled one too */ - PC.insert(&ednsQ, &r, 3600); + PC.insert(ednsQ, r, 3600); BOOST_CHECK_EQUAL(PC.size(), 2); /* different EDNS versions, should not match */ - BOOST_CHECK_EQUAL(PC.get(&ednsVersion42, &r2), false); + BOOST_CHECK_EQUAL(PC.get(ednsVersion42, r2), false); /* EDNS DO set, should not match */ - BOOST_CHECK_EQUAL(PC.get(&ednsDO, &r2), false); + BOOST_CHECK_EQUAL(PC.get(ednsDO, r2), false); /* EDNS Client Subnet set, should not match since not only we don't skip the actual option, but the total EDNS opt RR is still different. */ - BOOST_CHECK_EQUAL(PC.get(&ecs1, &r2), false); + BOOST_CHECK_EQUAL(PC.get(ecs1, r2), false); /* inserting the version with ECS Client Subnet set, it should NOT replace the existing EDNS one. */ - PC.insert(&ecs1, &r, 3600); + PC.insert(ecs1, r, 3600); BOOST_CHECK_EQUAL(PC.size(), 3); /* different subnet of same size, should NOT match since we don't skip the option */ - BOOST_CHECK_EQUAL(PC.get(&ecs2, &r2), false); + BOOST_CHECK_EQUAL(PC.get(ecs2, r2), false); BOOST_CHECK_EQUAL(r2.qdomain, r.qdomain); /* different subnet of different size, should NOT match. */ - BOOST_CHECK_EQUAL(PC.get(&ecs3, &r2), false); + BOOST_CHECK_EQUAL(PC.get(ecs3, r2), false); BOOST_CHECK_EQUAL(PC.purge("www.powerdns.com"), 3); - BOOST_CHECK_EQUAL(PC.get(&q, &r2), false); + BOOST_CHECK_EQUAL(PC.get(q, r2), false); BOOST_CHECK_EQUAL(PC.size(), 0); - PC.insert(&q, &r, 3600); + PC.insert(q, r, 3600); BOOST_CHECK_EQUAL(PC.size(), 1); - BOOST_CHECK_EQUAL(PC.get(&q, &r2), true); + BOOST_CHECK_EQUAL(PC.get(q, r2), true); BOOST_CHECK_EQUAL(r2.qdomain, r.qdomain); BOOST_CHECK_EQUAL(PC.purge("com$"), 1); - BOOST_CHECK_EQUAL(PC.get(&q, &r2), false); + BOOST_CHECK_EQUAL(PC.get(q, r2), false); BOOST_CHECK_EQUAL(PC.size(), 0); - PC.insert(&q, &r, 3600); + PC.insert(q, r, 3600); BOOST_CHECK_EQUAL(PC.size(), 1); - BOOST_CHECK_EQUAL(PC.get(&q, &r2), true); + BOOST_CHECK_EQUAL(PC.get(q, r2), true); BOOST_CHECK_EQUAL(r2.qdomain, r.qdomain); BOOST_CHECK_EQUAL(PC.purge("powerdns.com$"), 1); - BOOST_CHECK_EQUAL(PC.get(&q, &r2), false); + BOOST_CHECK_EQUAL(PC.get(q, r2), false); BOOST_CHECK_EQUAL(PC.size(), 0); - PC.insert(&q, &r, 3600); + PC.insert(q, r, 3600); BOOST_CHECK_EQUAL(PC.size(), 1); - BOOST_CHECK_EQUAL(PC.get(&q, &r2), true); + BOOST_CHECK_EQUAL(PC.get(q, r2), true); BOOST_CHECK_EQUAL(r2.qdomain, r.qdomain); BOOST_CHECK_EQUAL(PC.purge("www.powerdns.com$"), 1); - BOOST_CHECK_EQUAL(PC.get(&q, &r2), false); + BOOST_CHECK_EQUAL(PC.get(q, r2), false); BOOST_CHECK_EQUAL(PC.size(), 0); - PC.insert(&q, &r, 3600); + PC.insert(q, r, 3600); BOOST_CHECK_EQUAL(PC.size(), 1); BOOST_CHECK_EQUAL(PC.purge("www.powerdns.net"), 0); - BOOST_CHECK_EQUAL(PC.get(&q, &r2), true); + BOOST_CHECK_EQUAL(PC.get(q, r2), true); BOOST_CHECK_EQUAL(r2.qdomain, r.qdomain); BOOST_CHECK_EQUAL(PC.size(), 1); BOOST_CHECK_EQUAL(PC.purge("net$"), 0); - BOOST_CHECK_EQUAL(PC.get(&q, &r2), true); + BOOST_CHECK_EQUAL(PC.get(q, r2), true); BOOST_CHECK_EQUAL(r2.qdomain, r.qdomain); BOOST_CHECK_EQUAL(PC.size(), 1); diff --git a/pdns/test-signers.cc b/pdns/test-signers.cc index 6b8f77f8bf30..8881c599a03b 100644 --- a/pdns/test-signers.cc +++ b/pdns/test-signers.cc @@ -7,7 +7,6 @@ #include #include -#include #include "base64.hh" #include "dnsseckeeper.hh" diff --git a/pdns/tkey.cc b/pdns/tkey.cc index b8d9ce893e3f..d1dc180ba08f 100644 --- a/pdns/tkey.cc +++ b/pdns/tkey.cc @@ -3,13 +3,13 @@ #endif #include "packethandler.hh" -void PacketHandler::tkeyHandler(DNSPacket *p, DNSPacket *r) { +void PacketHandler::tkeyHandler(const DNSPacket& p, std::unique_ptr& r) { TKEYRecordContent tkey_in; std::shared_ptr tkey_out(new TKEYRecordContent()); DNSName name; bool sign = false; - if (!p->getTKEYRecord(&tkey_in, &name)) { + if (!p.getTKEYRecord(&tkey_in, &name)) { g_log<setRcode(RCode::FormErr); return; @@ -46,8 +46,8 @@ void PacketHandler::tkeyHandler(DNSPacket *p, DNSPacket *r) { tkey_out->d_error = 21; // BADALGO } } else if (tkey_in.d_mode == 5) { // destroy context - if (p->d_havetsig == false) { // unauthenticated - if (p->d.opcode == Opcode::Update) + if (p.d_havetsig == false) { // unauthenticated + if (p.d.opcode == Opcode::Update) r->setRcode(RCode::Refused); else r->setRcode(RCode::NotAuth); @@ -58,8 +58,8 @@ void PacketHandler::tkeyHandler(DNSPacket *p, DNSPacket *r) { else tkey_out->d_error = 20; // BADNAME (because we have no support for anything here) } else { - if (p->d_havetsig == false && tkey_in.d_mode != 2) { // unauthenticated - if (p->d.opcode == Opcode::Update) + if (p.d_havetsig == false && tkey_in.d_mode != 2) { // unauthenticated + if (p.d.opcode == Opcode::Update) r->setRcode(RCode::Refused); else r->setRcode(RCode::NotAuth); @@ -88,7 +88,7 @@ void PacketHandler::tkeyHandler(DNSPacket *p, DNSPacket *r) { trc.d_time = tkey_out->d_inception; trc.d_fudge = 300; trc.d_mac = ""; - trc.d_origID = p->d.id; + trc.d_origID = p.d.id; trc.d_eRcode = 0; trc.d_otherData = ""; // this should cause it to lookup name context diff --git a/pdns/toysdig.cc b/pdns/toysdig.cc index 4c65161bc7e1..c453f0e3b94a 100644 --- a/pdns/toysdig.cc +++ b/pdns/toysdig.cc @@ -56,20 +56,18 @@ class TCPResolver : public boost::noncopyable throw PDNSException("EOF on TCP read"); len=ntohs(len); - char *creply = new char[len]; + std::unique_ptr creply(new char[len]); int n=0; int numread; while(n(); + if (sem_init(m_pSemaphore.get(), 0, value) == -1) { g_log << Logger::Error << "Cannot create semaphore: " << stringerror() << endl; exit(1); } @@ -157,30 +157,29 @@ Semaphore::Semaphore(unsigned int value) int Semaphore::post() { - return sem_post(m_pSemaphore); + return sem_post(m_pSemaphore.get()); } int Semaphore::wait() { int ret; do - ret = sem_wait(m_pSemaphore); + ret = sem_wait(m_pSemaphore.get()); while (ret == -1 && errno == EINTR); return ret; } int Semaphore::tryWait() { - return sem_trywait(m_pSemaphore); + return sem_trywait(m_pSemaphore.get()); } int Semaphore::getValue(Semaphore::sem_value_t *sval) { - return sem_getvalue(m_pSemaphore, sval); + return sem_getvalue(m_pSemaphore.get(), sval); } Semaphore::~Semaphore() { - delete m_pSemaphore; } #endif diff --git a/pdns/utility.hh b/pdns/utility.hh index 8a7083fd3a79..081de34aa850 100644 --- a/pdns/utility.hh +++ b/pdns/utility.hh @@ -59,7 +59,7 @@ private: sem_value_t m_count; uint32_t m_nwaiters; #else - sem_t *m_pSemaphore; + std::unique_ptr m_pSemaphore; #endif protected: diff --git a/pdns/webserver.hh b/pdns/webserver.hh index 707b0e23c462..40e37ded3dd4 100644 --- a/pdns/webserver.hh +++ b/pdns/webserver.hh @@ -30,8 +30,6 @@ #include "namespaces.hh" #include "sstuff.hh" -class WebServer; - class HttpRequest : public YaHTTP::Request { public: HttpRequest(const string& logprefix="") : YaHTTP::Request(), accept_json(false), accept_html(false), complete(false), logprefix(logprefix) { }; diff --git a/pdns/ws-recursor.cc b/pdns/ws-recursor.cc index 1d6c4d50a82e..82c8b755199b 100644 --- a/pdns/ws-recursor.cc +++ b/pdns/ws-recursor.cc @@ -500,7 +500,7 @@ RecursorWebServer::RecursorWebServer(FDMultiplexer* fdm) { registerAllStats(); - d_ws = new AsyncWebServer(fdm, arg()["webserver-address"], arg().asNum("webserver-port")); + d_ws = std::unique_ptr(new AsyncWebServer(fdm, arg()["webserver-address"], arg().asNum("webserver-port"))); d_ws->setApiKey(arg()["api-key"]); d_ws->setPassword(arg()["webserver-password"]); d_ws->setLogLevel(arg()["webserver-loglevel"]); diff --git a/pdns/ws-recursor.hh b/pdns/ws-recursor.hh index 9df3a81c7e26..ae8e47568a4d 100644 --- a/pdns/ws-recursor.hh +++ b/pdns/ws-recursor.hh @@ -69,7 +69,7 @@ public: void jsonstat(HttpRequest* req, HttpResponse *resp); private: - AsyncWebServer* d_ws; + std::unique_ptr d_ws{nullptr}; }; #endif /* PDNS_WSRECURSOR_HH */