From: Remi Gacogne Date: Mon, 12 Dec 2016 09:04:13 +0000 (+0100) Subject: rec: Allocate the DNSQuestion `dq` object on the stack X-Git-Tag: dnsdist-1.1.0~17^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6e505c5e50edff58bd7e479b55f8365fa050700c;p=pdns rec: Allocate the DNSQuestion `dq` object on the stack We don't need to allocate a `shared_ptr` for each query. --- diff --git a/pdns/lua-recursor4.cc b/pdns/lua-recursor4.cc index e04073d70..650ac3708 100644 --- a/pdns/lua-recursor4.cc +++ b/pdns/lua-recursor4.cc @@ -36,27 +36,27 @@ RecursorLua4::RecursorLua4(const std::string &fname) throw std::runtime_error("Attempt to load a Lua script in a PowerDNS binary without Lua support"); } -bool RecursorLua4::nxdomain(std::shared_ptr dq, int& res) +bool RecursorLua4::nxdomain(DNSQuestion& dq, int& res) { return false; } -bool RecursorLua4::nodata(std::shared_ptr dq, int& res) +bool RecursorLua4::nodata(DNSQuestion& dq, int& res) { return false; } -bool RecursorLua4::postresolve(std::shared_ptr dq, int& res) +bool RecursorLua4::postresolve(DNSQuestion& dq, int& res) { return false; } -bool RecursorLua4::prerpz(std::shared_ptr dq, int& ret) +bool RecursorLua4::prerpz(DNSQuestion& dq, int& ret) { return false; } -bool RecursorLua4::preresolve(std::shared_ptr dq, int& res) +bool RecursorLua4::preresolve(DNSQuestion& dq, int& res) { return false; } @@ -586,27 +586,27 @@ RecursorLua4::RecursorLua4(const std::string& fname) d_gettag = d_lw->readVariable>("gettag").get_value_or(0); } -bool RecursorLua4::prerpz(std::shared_ptr dq, int& ret) +bool RecursorLua4::prerpz(DNSQuestion& dq, int& ret) { return genhook(d_prerpz, dq, ret); } -bool RecursorLua4::preresolve(std::shared_ptr dq, int& ret) +bool RecursorLua4::preresolve(DNSQuestion& dq, int& ret) { return genhook(d_preresolve, dq, ret); } -bool RecursorLua4::nxdomain(std::shared_ptr dq, int& ret) +bool RecursorLua4::nxdomain(DNSQuestion& dq, int& ret) { return genhook(d_nxdomain, dq, ret); } -bool RecursorLua4::nodata(std::shared_ptr dq, int& ret) +bool RecursorLua4::nodata(DNSQuestion& dq, int& ret) { return genhook(d_nodata, dq, ret); } -bool RecursorLua4::postresolve(std::shared_ptr dq, int& ret) +bool RecursorLua4::postresolve(DNSQuestion& dq, int& ret) { return genhook(d_postresolve, dq, ret); } @@ -615,8 +615,8 @@ bool RecursorLua4::preoutquery(const ComboAddress& ns, const ComboAddress& reque { bool variableAnswer = false; bool wantsRPZ = false; - auto dq = std::make_shared(requestor, ns, query, qtype.getCode(), isTcp, variableAnswer, wantsRPZ); - dq->currentRecords = &res; + auto dq = RecursorLua4::DNSQuestion(requestor, ns, query, qtype.getCode(), isTcp, variableAnswer, wantsRPZ); + dq.currentRecords = &res; return genhook(d_preoutquery, dq, ret); } @@ -646,44 +646,44 @@ int RecursorLua4::gettag(const ComboAddress& remote, const Netmask& ednssubnet, return 0; } -bool RecursorLua4::genhook(luacall_t& func, std::shared_ptr dq, int& ret) +bool RecursorLua4::genhook(luacall_t& func, DNSQuestion& dq, int& ret) { if(!func) return false; - if (dq->currentRecords) { - dq->records = *dq->currentRecords; + if (dq.currentRecords) { + dq.records = *dq.currentRecords; } else { - dq->records.clear(); + dq.records.clear(); } - dq->followupFunction.clear(); - dq->followupPrefix.clear(); - dq->followupName.clear(); - dq->udpQuery.clear(); - dq->udpAnswer.clear(); - dq->udpCallback.clear(); + dq.followupFunction.clear(); + dq.followupPrefix.clear(); + dq.followupName.clear(); + dq.udpQuery.clear(); + dq.udpAnswer.clear(); + dq.udpCallback.clear(); - dq->rcode = ret; + dq.rcode = ret; bool handled=func(dq); if(handled) { loop:; - ret=dq->rcode; + ret=dq.rcode; - if(!dq->followupFunction.empty()) { - if(dq->followupFunction=="followCNAMERecords") { - ret = followCNAMERecords(dq->records, QType(dq->qtype)); + if(!dq.followupFunction.empty()) { + if(dq.followupFunction=="followCNAMERecords") { + ret = followCNAMERecords(dq.records, QType(dq.qtype)); } - else if(dq->followupFunction=="getFakeAAAARecords") { - ret=getFakeAAAARecords(dq->followupName, dq->followupPrefix, dq->records); + else if(dq.followupFunction=="getFakeAAAARecords") { + ret=getFakeAAAARecords(dq.followupName, dq.followupPrefix, dq.records); } - else if(dq->followupFunction=="getFakePTRRecords") { - ret=getFakePTRRecords(dq->followupName, dq->followupPrefix, dq->records); + else if(dq.followupFunction=="getFakePTRRecords") { + ret=getFakePTRRecords(dq.followupName, dq.followupPrefix, dq.records); } - else if(dq->followupFunction=="udpQueryResponse") { - dq->udpAnswer = GenUDPQueryResponse(dq->udpQueryDest, dq->udpQuery); - auto func = d_lw->readVariable>(dq->udpCallback).get_value_or(0); + else if(dq.followupFunction=="udpQueryResponse") { + dq.udpAnswer = GenUDPQueryResponse(dq.udpQueryDest, dq.udpQuery); + auto func = d_lw->readVariable>(dq.udpCallback).get_value_or(0); if(!func) { theL()<currentRecords) { - *dq->currentRecords = dq->records; + if (dq.currentRecords) { + *dq.currentRecords = dq.records; } } diff --git a/pdns/lua-recursor4.hh b/pdns/lua-recursor4.hh index 230f07a85..fe9236027 100644 --- a/pdns/lua-recursor4.hh +++ b/pdns/lua-recursor4.hh @@ -98,11 +98,11 @@ public: int gettag(const ComboAddress& remote, const Netmask& ednssubnet, const ComboAddress& local, const DNSName& qname, uint16_t qtype, std::vector* policyTags); - bool prerpz(std::shared_ptr dq, int& ret); - bool preresolve(std::shared_ptr dq, int& ret); - bool nxdomain(std::shared_ptr dq, int& ret); - bool nodata(std::shared_ptr dq, int& ret); - bool postresolve(std::shared_ptr dq, int& ret); + bool prerpz(DNSQuestion& dq, int& ret); + bool preresolve(DNSQuestion& dq, int& ret); + bool nxdomain(DNSQuestion& dq, int& ret); + bool nodata(DNSQuestion& dq, int& ret); + bool postresolve(DNSQuestion& dq, int& ret); bool preoutquery(const ComboAddress& ns, const ComboAddress& requestor, const DNSName& query, const QType& qtype, bool isTcp, vector& res, int& ret); bool ipfilter(const ComboAddress& remote, const ComboAddress& local, const struct dnsheader&); @@ -120,9 +120,9 @@ public: gettag_t d_gettag; // public so you can query if we have this hooked private: - typedef std::function)> luacall_t; + typedef std::function luacall_t; luacall_t d_prerpz, d_preresolve, d_nxdomain, d_nodata, d_postresolve, d_preoutquery, d_postoutquery; - bool genhook(luacall_t& func, std::shared_ptr dq, int& ret); + bool genhook(luacall_t& func, DNSQuestion& dq, int& ret); typedef std::function ipfilter_t; ipfilter_t d_ipfilter; }; diff --git a/pdns/pdns_recursor.cc b/pdns/pdns_recursor.cc index 8c87337cb..08ee4d101 100644 --- a/pdns/pdns_recursor.cc +++ b/pdns/pdns_recursor.cc @@ -743,18 +743,15 @@ void startDoResolve(void *p) int res; DNSFilterEngine::Policy appliedPolicy; DNSRecord spoofed; - std::shared_ptr dq = nullptr; - if (t_pdl->get() && (*t_pdl)->needDQ()) { - dq = std::make_shared(dc->d_remote, dc->d_local, dc->d_mdp.d_qname, dc->d_mdp.d_qtype, dc->d_tcp, variableAnswer, wantsRPZ); - dq->ednsFlags = &edo.d_Z; - dq->ednsOptions = &dc->d_ednsOpts; - dq->tag = dc->d_tag; - dq->discardedPolicies = &sr.d_discardedPolicies; - dq->policyTags = &dc->d_policyTags; - dq->appliedPolicy = &appliedPolicy; - dq->currentRecords = &ret; - dq->dh = &dc->d_mdp.d_header; - } + RecursorLua4::DNSQuestion dq(dc->d_remote, dc->d_local, dc->d_mdp.d_qname, dc->d_mdp.d_qtype, dc->d_tcp, variableAnswer, wantsRPZ); + dq.ednsFlags = &edo.d_Z; + dq.ednsOptions = &dc->d_ednsOpts; + dq.tag = dc->d_tag; + dq.discardedPolicies = &sr.d_discardedPolicies; + dq.policyTags = &dc->d_policyTags; + dq.appliedPolicy = &appliedPolicy; + dq.currentRecords = &ret; + dq.dh = &dc->d_mdp.d_header; if(dc->d_mdp.d_qtype==QType::ANY && !dc->d_tcp && g_anyToTcp) { pw.getHeader()->tc = 1;