From: Otto Moerbeek Date: Tue, 10 Jan 2023 13:27:27 +0000 (+0100) Subject: rec: do not chain ecs enabled queries. X-Git-Tag: dnsdist-1.8.0-rc1~112^2~3 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5b90e5daf9d40aa8be77119c3ad01179267abc3f;p=thirdparty%2Fpdns.git rec: do not chain ecs enabled queries. asyncresolve() assumes the recieved ecs info corresponds to the one sent out. --- diff --git a/pdns/recursordist/lwres.cc b/pdns/recursordist/lwres.cc index 7cf9d7972d..40e44fc659 100644 --- a/pdns/recursordist/lwres.cc +++ b/pdns/recursordist/lwres.cc @@ -422,7 +422,6 @@ static LWResult::Result asyncresolve(const ComboAddress& ip, const DNSName& doma eo.source = *srcmask; outgoingECSBits = srcmask->getBits(); outgoingECSAddr = srcmask->getNetwork(); - // cout<<"Adding request mask: "< t_udpclientsocks; /* these two functions are used by LWRes */ LWResult::Result asendto(const char* data, size_t len, int flags, - const ComboAddress& toaddr, uint16_t id, const DNSName& domain, uint16_t qtype, int* fd) + const ComboAddress& toaddr, uint16_t id, const DNSName& domain, uint16_t qtype, bool ecs, int* fd) { auto pident = std::make_shared(); @@ -267,18 +267,24 @@ LWResult::Result asendto(const char* data, size_t len, int flags, pident->remote = toaddr; pident->type = qtype; - // see if there is an existing outstanding request we can chain on to, using partial equivalence function looking for the same - // query (qname and qtype) to the same host, but with a different message ID - pair chain = MT->d_waiters.equal_range(pident, PacketIDBirthdayCompare()); - - for (; chain.first != chain.second; chain.first++) { - // Line below detected an issue with the two ways of ordering PackeIDs (birtday and non-birthday) - assert(chain.first->key->domain == pident->domain); - if (chain.first->key->fd > -1 && !chain.first->key->closed) { // don't chain onto existing chained waiter or a chain already processed - // cerr << "Insert " << id << ' ' << pident << " into chain for " << chain.first->key << endl; - chain.first->key->chain.insert(id); // we can chain - *fd = -1; // gets used in waitEvent / sendEvent later on - return LWResult::Result::Success; + // We might want to put the ecs netmask into the PacketID key, but we take the easy way: + // Avoid processing a chain with queries having different ECS data by lwres:asyncresolve() as it + // assumes the mask received corresponds to the mask sent out, so do not chain ecs queries. + if (!ecs) { + // See if there is an existing outstanding request we can chain on to, using partial equivalence + // function looking for the same query (qname and qtype) to the same host, but with a different + // message ID. + auto chain = MT->d_waiters.equal_range(pident, PacketIDBirthdayCompare()); + + for (; chain.first != chain.second; chain.first++) { + // Line below detected an issue with the two ways of ordering PackeIDs (birtday and non-birthday) + assert(chain.first->key->domain == pident->domain); + // don't chain onto existing chained waiter or a chain already processed + if (chain.first->key->fd > -1 && !chain.first->key->closed) { + chain.first->key->chain.insert(id); // we can chain + *fd = -1; // gets used in waitEvent / sendEvent later on + return LWResult::Result::Success; + } } }