From: Peter van Dijk Date: Fri, 22 Nov 2019 13:09:03 +0000 (+0100) Subject: manual backport of #8301 X-Git-Tag: auth-4.2.1~2^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ce2d26b728359ba529af6f9da0da95fdaa2f7a57;p=thirdparty%2Fpdns.git manual backport of #8301 --- diff --git a/pdns/packethandler.cc b/pdns/packethandler.cc index 0b60e81443..34ea3ef12c 100644 --- a/pdns/packethandler.cc +++ b/pdns/packethandler.cc @@ -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: '"<getCode()<<"'"<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);