From 0dc51a5b1a9b166a3186a99bad0ddbfb1475c283 Mon Sep 17 00:00:00 2001 From: Otto Moerbeek Date: Wed, 15 Jan 2025 12:21:07 +0100 Subject: [PATCH] Pass actual (optional) ecs instead of bool to asendto() --- pdns/recursordist/lwres.cc | 16 +++++++--------- pdns/recursordist/lwres.hh | 4 +++- pdns/recursordist/pdns_recursor.cc | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pdns/recursordist/lwres.cc b/pdns/recursordist/lwres.cc index 8cbf8a853f..463f99644e 100644 --- a/pdns/recursordist/lwres.cc +++ b/pdns/recursordist/lwres.cc @@ -423,16 +423,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; } @@ -478,7 +475,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, *now); + ret = asendto(vpacket.data(), vpacket.size(), 0, address, qid, domain, type, subnetOpts, &queryfd, *now); if (ret != LWResult::Result::Success) { return ret; @@ -612,7 +609,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 58d43535e3..807157309f 100644 --- a/pdns/recursordist/lwres.hh +++ b/pdns/recursordist/lwres.hh @@ -86,8 +86,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, timeval& now); + 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 3aed8c4fcd..c5dd5cc908 100644 --- a/pdns/recursordist/pdns_recursor.cc +++ b/pdns/recursordist/pdns_recursor.cc @@ -283,7 +283,7 @@ unsigned int authWaitTimeMSec(const std::unique_ptr& mtasker) /* 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, timeval& now) + 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(); -- 2.47.2