]> granicus.if.org Git - pdns/commitdiff
rec: Use a ptr instead of a temporary vector for `dq policyTags`
authorRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 23 Jun 2016 08:40:01 +0000 (10:40 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 23 Jun 2016 08:40:01 +0000 (10:40 +0200)
pdns/lua-recursor4.cc
pdns/lua-recursor4.hh

index 84ad7d0e7d1fd0f82f7371e3610b24cdb9c90ff8..f3b9ace731901b6317bf50b54864dfe7cb519638 100644 (file)
@@ -343,18 +343,22 @@ RecursorLua4::RecursorLua4(const std::string& fname)
   d_lw->registerFunction("getRecords", &DNSQuestion::getRecords);
   d_lw->registerFunction("setRecords", &DNSQuestion::setRecords);
 
-  d_lw->registerFunction<void(DNSQuestion::*)(const std::string&)>("addPolicyTag", [](DNSQuestion& dq, const std::string& tag) { dq.policyTags.push_back(tag); });
+  d_lw->registerFunction<void(DNSQuestion::*)(const std::string&)>("addPolicyTag", [](DNSQuestion& dq, const std::string& tag) { if (dq.policyTags) { dq.policyTags->push_back(tag); } });
   d_lw->registerFunction<void(DNSQuestion::*)(const std::vector<std::pair<int, std::string> >&)>("setPolicyTags", [](DNSQuestion& dq, const std::vector<std::pair<int, std::string> >& tags) {
-      dq.policyTags.clear();
-      for (const auto& tag : tags) {
-        dq.policyTags.push_back(tag.second);
+      if (dq.policyTags) {
+        dq.policyTags->clear();
+        for (const auto& tag : tags) {
+          dq.policyTags->push_back(tag.second);
+        }
       }
     });
   d_lw->registerFunction<std::vector<std::pair<int, std::string> >(DNSQuestion::*)()>("getPolicyTags", [](const DNSQuestion& dq) {
       std::vector<std::pair<int, std::string> > ret;
-      int count = 1;
-      for (const auto& tag : dq.policyTags) {
-        ret.push_back({count++, tag});
+      if (dq.policyTags) {
+        int count = 1;
+        for (const auto& tag : *dq.policyTags) {
+          ret.push_back({count++, tag});
+        }
       }
       return ret;
     });
@@ -512,16 +516,10 @@ bool RecursorLua4::genhook(luacall_t& func, const ComboAddress& remote,const Com
   dq->tag = tag;
   dq->ednsOptions = ednsOpts;
   dq->isTcp = isTcp;
-  if (policyTags) {
-    dq->policyTags = *policyTags;
-  }
+  dq->policyTags = policyTags;
   bool handled=func(dq);
   if(variable) *variable |= dq->variable; // could still be set to indicate this *name* is variable, even if not 'handled'
 
-  if (policyTags) { // same
-    *policyTags = dq->policyTags;
-  }
-
   if(handled) {
 loop:;
     ret=dq->rcode;
index f168cd8a0cd3e8b1eb37721033b54e37530a7b39..cbf8087841fb615b8e937139ee66bdc4c40ec181 100644 (file)
@@ -67,7 +67,7 @@ private:
     DNSName followupName;
 
     string appliedPolicy;
-    std::vector<std::string> policyTags;
+    std::vector<std::string>* policyTags;
     bool isTcp;
   };