From: Peter van Dijk Date: Wed, 23 Jun 2021 10:42:20 +0000 (+0200) Subject: auth SVCB additional processing: delay inserts to avoid invalidating iterator X-Git-Tag: dnsdist-1.7.0-alpha1~126^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ee2163cdb1e0de07afa48d1f652285e3a61ebcd5;p=thirdparty%2Fpdns.git auth SVCB additional processing: delay inserts to avoid invalidating iterator --- diff --git a/pdns/packethandler.cc b/pdns/packethandler.cc index 26818a844f..c1d70bd5a8 100644 --- a/pdns/packethandler.cc +++ b/pdns/packethandler.cc @@ -453,7 +453,7 @@ bool PacketHandler::getBestWildcard(DNSPacket& p, const DNSName &target, DNSName return haveSomething; } -DNSName PacketHandler::doAdditionalServiceProcessing(const DNSName &firstTarget, const uint16_t &qtype, std::unique_ptr& r) { +DNSName PacketHandler::doAdditionalServiceProcessing(const DNSName &firstTarget, const uint16_t &qtype, std::unique_ptr& r, vector& extraRecords) { DNSName ret = firstTarget; size_t ctr = 5; // Max 5 SVCB Aliasforms per query bool done = false; @@ -467,7 +467,7 @@ DNSName PacketHandler::doAdditionalServiceProcessing(const DNSName &firstTarget, case QType::SVCB: /* fall-through */ case QType::HTTPS: { auto rrc = getRR(rr.dr); - r->addRecord(std::move(rr)); + extraRecords.push_back(std::move(rr)); ret = rrc->getTarget().isRoot() ? ret : rrc->getTarget(); if (rrc->getPriority() == 0) { done = false; @@ -490,6 +490,7 @@ void PacketHandler::doAdditionalProcessing(DNSPacket& p, std::unique_ptr lookup; + vector extraRecords; const auto& rrs = r->getRRS(); lookup.reserve(rrs.size()); @@ -512,7 +513,7 @@ void PacketHandler::doAdditionalProcessing(DNSPacket& p, std::unique_ptraddRecord(std::move(rr)); + } + extraRecords.clear(); // TODO should we have a setting to do this? for (auto &rec : r->getServiceRecords()) { // Process auto hints diff --git a/pdns/packethandler.hh b/pdns/packethandler.hh index ef18f7d602..01b4c403e9 100644 --- a/pdns/packethandler.hh +++ b/pdns/packethandler.hh @@ -77,7 +77,8 @@ private: bool addCDS(DNSPacket& p, std::unique_ptr& r); bool addNSEC3PARAM(const DNSPacket& p, std::unique_ptr& r); void doAdditionalProcessing(DNSPacket& p, std::unique_ptr& r); - DNSName doAdditionalServiceProcessing(const DNSName &firstTarget, const uint16_t &qtype, std::unique_ptr& r); + DNSName doAdditionalServiceProcessing(const DNSName &firstTarget, const uint16_t &qtype, std::unique_ptr& r, vector& extraRecords); + //! Get all IPv4 or IPv6 addresses (based on |qtype|) for |target|. vector getIPAddressFor(const DNSName &target, const uint16_t qtype); void addNSECX(DNSPacket& p, std::unique_ptr& r, const DNSName &target, const DNSName &wildcard, int mode);