]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
manual backport of #8301 8570/head
authorPeter van Dijk <peter.van.dijk@powerdns.com>
Fri, 22 Nov 2019 13:09:03 +0000 (14:09 +0100)
committerPeter van Dijk <peter.van.dijk@powerdns.com>
Fri, 22 Nov 2019 13:09:03 +0000 (14:09 +0100)
pdns/packethandler.cc

index 0b60e81443d2b8f1f534556603e188fd561d2a30..34ea3ef12cca62ec2c5df99d5e34263c085d9b14 100644 (file)
@@ -389,12 +389,19 @@ bool PacketHandler::getBestWildcard(DNSPacket *p, SOAData& sd, const DNSName &ta
         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: '"<<rec->getCode()<<"'"<<endl);
-          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
-            ret->push_back(rr);
+          try {
+            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
+              ret->push_back(rr);
+            }
+          }
+          catch (std::exception &e) {
+            while (B.get(rr)) ;                 // don't leave DB handle in bad state
+
+            throw;
           }
         }
       }
@@ -1360,6 +1367,8 @@ DNSPacket *PacketHandler::doQuestion(DNSPacket *p)
             }
           }
           catch(std::exception &e) {
+            while (B.get(rr)) ;              // don't leave DB handle in bad state
+
             r=p->replyPacket();
             r->setRcode(RCode::ServFail);