From: Miod Vallat Date: Fri, 4 Apr 2025 07:10:38 +0000 (+0200) Subject: Split handling of Query opcode, step 2/2. X-Git-Tag: dnsdist-2.0.0-alpha2~69^2~3 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=75cfa036612e6d333cf875b01df8fa28b8f79e0f;p=thirdparty%2Fpdns.git Split handling of Query opcode, step 2/2. Gets rid of the "retargeted" goto label. --- diff --git a/pdns/packethandler.cc b/pdns/packethandler.cc index 2c3b28f048..255ffc3c25 100644 --- a/pdns/packethandler.cc +++ b/pdns/packethandler.cc @@ -1499,19 +1499,6 @@ std::unique_ptr PacketHandler::doQuestion(DNSPacket& p) bool PacketHandler::opcodeQueryInner(DNSPacket& p, queryState &state) { - DNSZoneRecord rr; - - int retargetcount=0; - - vector rrset; - bool weDone=false, weRedirected=false, weHaveUnauth=false; - DNSName haveAlias; - uint8_t aliasScopeMask; - -#ifdef HAVE_LUA_RECORDS - bool doLua=g_doLuaRecord; -#endif - state.r=p.replyPacket(); // generate an empty reply packet, possibly with TSIG details inside // g_log<setA(false); - retargeted:; - if(retargetcount > 10) { // XXX FIXME, retargetcount++? - g_log< 10) { // XXX FIXME, retargetcount++? + g_log<setRcode(RCode::ServFail); return false; } - if (retargetcount > 0 && !d_doResolveAcrossZones && !target.isPartOf(state.r->qdomainzone)) { + if (state.retargetcount > 0 && !d_doResolveAcrossZones && !state.target.isPartOf(state.r->qdomainzone)) { // We are following a retarget outside the initial zone (and do not need to check getAuth to know this). Config asked us not to do that. // This is a performance optimization, the generic case is checked after getAuth below. return true; } - if(!B.getAuth(target, p.qtype, &d_sd)) { - DLOG(g_log<setA(false); // drop AA if we never had a SOA in the first place state.r->setRcode(RCode::Refused); // send REFUSED - but only on empty 'no idea' } @@ -1572,7 +1575,7 @@ bool PacketHandler::opcodeQueryInner(DNSPacket& p, queryState &state) } DLOG(g_log<setRcode(RCode::Refused); return true; } DLOG(g_log<<"Checking for referrals first, unless this is a DS query"< rrset; + DNSName haveAlias; + uint8_t aliasScopeMask = 0; + bool weDone=false, weRedirected=false, weHaveUnauth=false; while(B.get(rr)) { #ifdef HAVE_LUA_RECORDS @@ -1661,7 +1664,7 @@ bool PacketHandler::opcodeQueryInner(DNSPacket& p, queryState &state) if(rec->d_type == QType::CNAME || rec->d_type == p.qtype.getCode() || (p.qtype.getCode() == QType::ANY && rec->d_type != QType::RRSIG)) { state.noCache=true; try { - auto recvec=luaSynth(rec->getCode(), target, rr, d_sd.qname, p, rec->d_type, s_LUA); + auto recvec=luaSynth(rec->getCode(), state.target, rr, d_sd.qname, p, rec->d_type, s_LUA); if(!recvec.empty()) { for (const auto& r_it : recvec) { rr.dr.d_type = rec->d_type; // might be CNAME @@ -1703,7 +1706,7 @@ bool PacketHandler::opcodeQueryInner(DNSPacket& p, queryState &state) if (DP && rr.dr.d_type == QType::ALIAS && (p.qtype.getCode() == QType::A || p.qtype.getCode() == QType::AAAA || p.qtype.getCode() == QType::ANY) && !d_dk.isPresigned(d_sd.qname)) { if (!d_doExpandALIAS) { - g_log<(rr.dr)->getContent(); @@ -1718,21 +1721,21 @@ bool PacketHandler::opcodeQueryInner(DNSPacket& p, queryState &state) } /* Add in SOA if required */ - if(target==d_sd.qname) { + if(state.target==d_sd.qname) { rr=makeEditedDNSZRFromSOAData(d_dk, d_sd); rrset.push_back(rr); } - DLOG(g_log<<"After first ANY query for '"<completePacket(state.r, haveAlias, target, aliasScopeMask); + DLOG(g_log<completePacket(state.r, haveAlias, state.target, aliasScopeMask); state.r = nullptr; return false; } @@ -1763,7 +1766,7 @@ bool PacketHandler::opcodeQueryInner(DNSPacket& p, queryState &state) } if(doReferral) { DLOG(g_log<<"DS query found no direct result, trying referral now"<qdomainwild=wildcard; - retargetcount++; - goto retargeted; + if(!state.retargetcount) state.r->qdomainwild=wildcard; + state.retargeted = true; + return true; } if(nodata) - makeNOError(p, state.r, target, wildcard, 2); + makeNOError(p, state.r, state.target, wildcard, 2); return true; } try { - if (tryDNAME(p, state.r, target)) { - retargetcount++; - goto retargeted; + if (tryDNAME(p, state.r, state.target)) { + state.retargeted = true; + return true; } } catch (const std::range_error &e) { // We couldn't make a CNAME..... @@ -1797,8 +1800,8 @@ bool PacketHandler::opcodeQueryInner(DNSPacket& p, queryState &state) return true; } - if (!(((p.qtype.getCode() == QType::CNAME) || (p.qtype.getCode() == QType::ANY)) && retargetcount > 0)) - makeNXDomain(p, state.r, target, wildcard); + if (!(((p.qtype.getCode() == QType::CNAME) || (p.qtype.getCode() == QType::ANY)) && state.retargetcount > 0)) + makeNXDomain(p, state.r, state.target, wildcard); return true; } @@ -1807,9 +1810,9 @@ bool PacketHandler::opcodeQueryInner(DNSPacket& p, queryState &state) for(auto& loopRR: rrset) { if(loopRR.dr.d_type == QType::CNAME) { state.r->addRecord(DNSZoneRecord(loopRR)); - target = getRR(loopRR.dr)->getTarget(); - retargetcount++; - goto retargeted; + state.target = getRR(loopRR.dr)->getTarget(); + state.retargeted = true; + return true; } } } @@ -1836,16 +1839,16 @@ bool PacketHandler::opcodeQueryInner(DNSPacket& p, queryState &state) if (haveRecords) { if(d_dnssec && p.qtype.getCode() == QType::ANY) - completeANYRecords(p, state.r, target); + completeANYRecords(p, state.r, state.target); } else - makeNOError(p, state.r, target, DNSName(), 0); + makeNOError(p, state.r, state.target, DNSName(), 0); return true; } else if(weHaveUnauth) { DLOG(g_log<<"Have unauth data, so need to hunt for best NS records"< r{nullptr}; set authSet; + DNSName target; + int retargetcount{0}; bool doSigs{false}; bool noCache{false}; + bool retargeted{false}; }; bool opcodeQueryInner(DNSPacket&, queryState&); + bool opcodeQueryInner2(DNSPacket&, queryState&); std::unique_ptr opcodeQuery(DNSPacket&, bool); std::unique_ptr opcodeNotify(DNSPacket&, bool); std::unique_ptr opcodeUpdate(DNSPacket&, bool);