From ce2d26b728359ba529af6f9da0da95fdaa2f7a57 Mon Sep 17 00:00:00 2001 From: Peter van Dijk Date: Fri, 22 Nov 2019 14:09:03 +0100 Subject: [PATCH] manual backport of #8301 --- pdns/packethandler.cc | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) 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); -- 2.47.2