From: Otto Moerbeek Date: Wed, 15 Jan 2025 11:21:07 +0000 (+0100) Subject: Pass actual (optional) ecs instead of bool to asendto() X-Git-Tag: rec-5.0.12~1^2~13 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ad89acef174329ef255be6e5f1787e3ce799f280;p=thirdparty%2Fpdns.git Pass actual (optional) ecs instead of bool to asendto() --- diff --git a/pdns/recursordist/lwres.cc b/pdns/recursordist/lwres.cc index 3561d11cfd..3a230ec40c 100644 --- a/pdns/recursordist/lwres.cc +++ b/pdns/recursordist/lwres.cc @@ -412,16 +412,13 @@ static LWResult::Result asyncresolve(const ComboAddress& address, const DNSName& string ping; bool weWantEDNSSubnet = false; - uint8_t outgoingECSBits = 0; - ComboAddress outgoingECSAddr; + std::optional subnetOpts = std::nullopt; if (EDNS0Level > 0) { DNSPacketWriter::optvect_t opts; if (srcmask) { - EDNSSubnetOpts eo; - eo.source = *srcmask; - outgoingECSBits = srcmask->getBits(); - outgoingECSAddr = srcmask->getNetwork(); - opts.emplace_back(EDNSOptionCode::ECS, makeEDNSSubnetOptsString(eo)); + subnetOpts = EDNSSubnetOpts{}; + subnetOpts->source = *srcmask; + opts.emplace_back(EDNSOptionCode::ECS, makeEDNSSubnetOptsString(*subnetOpts)); weWantEDNSSubnet = true; } @@ -467,7 +464,7 @@ static LWResult::Result asyncresolve(const ComboAddress& address, const DNSName& if (!doTCP) { int queryfd; - ret = asendto(vpacket.data(), vpacket.size(), 0, address, qid, domain, type, weWantEDNSSubnet, &queryfd); + ret = asendto(vpacket.data(), vpacket.size(), 0, address, qid, domain, type, subnetOpts, &queryfd, *now); if (ret != LWResult::Result::Success) { return ret; @@ -595,7 +592,8 @@ static LWResult::Result asyncresolve(const ComboAddress& address, const DNSName& IPv4 and IPv6. Still I'm pretty sure it doesn't matter in real life, so let's not duplicate entries in our cache. */ if (reso.scope.getBits()) { - uint8_t bits = std::min(reso.scope.getBits(), outgoingECSBits); + uint8_t bits = std::min(reso.scope.getBits(), subnetOpts->source.getBits()); + auto outgoingECSAddr = subnetOpts->source.getNetwork(); outgoingECSAddr.truncate(bits); srcmask = Netmask(outgoingECSAddr, bits); } diff --git a/pdns/recursordist/lwres.hh b/pdns/recursordist/lwres.hh index 07a0185a4d..6379291a02 100644 --- a/pdns/recursordist/lwres.hh +++ b/pdns/recursordist/lwres.hh @@ -83,8 +83,10 @@ public: bool d_haveEDNS{false}; }; +struct EDNSSubnetOpts; + LWResult::Result asendto(const void* data, size_t len, int flags, const ComboAddress& toAddress, uint16_t qid, - const DNSName& domain, uint16_t qtype, bool ecs, int* fileDesc); + const DNSName& domain, uint16_t qtype, const std::optional& ecs, int* fileDesc, timeval& now); LWResult::Result arecvfrom(PacketBuffer& packet, int flags, const ComboAddress& fromAddr, size_t& len, uint16_t qid, const DNSName& domain, uint16_t qtype, int fileDesc, const struct timeval& now); diff --git a/pdns/recursordist/pdns_recursor.cc b/pdns/recursordist/pdns_recursor.cc index d5fdf08248..7c80fd3a75 100644 --- a/pdns/recursordist/pdns_recursor.cc +++ b/pdns/recursordist/pdns_recursor.cc @@ -269,7 +269,7 @@ thread_local std::unique_ptr t_udpclientsocks; /* these two functions are used by LWRes */ LWResult::Result asendto(const void* data, size_t len, int /* flags */, - const ComboAddress& toAddress, uint16_t qid, const DNSName& domain, uint16_t qtype, bool ecs, int* fileDesc) + const ComboAddress& toAddress, uint16_t qid, const DNSName& domain, uint16_t qtype, const std::optional& ecs, int* fileDesc, timeval& now) { auto pident = std::make_shared();