From d0e851b6d526773e135f2cf2fd070322c5290fea Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Fri, 21 Jun 2024 11:04:02 +0200 Subject: [PATCH] dnsdist: Reduce the dependency on dnsdist::configuration.hh Getting rid of the ugly DNSQuestion stubs in the meantime. --- pdns/dnsdistdist/Makefile.am | 3 + pdns/dnsdistdist/dnsdist-dnsquestion.cc | 60 +++++++++++++++++++ pdns/dnsdistdist/dnsdist.cc | 34 ----------- pdns/dnsdistdist/dnsdist.hh | 6 +- pdns/dnsdistdist/test-dnsdist-lua-ffi.cc | 3 - pdns/dnsdistdist/test-dnsdistlbpolicies_cc.cc | 12 ---- 6 files changed, 64 insertions(+), 54 deletions(-) create mode 100644 pdns/dnsdistdist/dnsdist-dnsquestion.cc diff --git a/pdns/dnsdistdist/Makefile.am b/pdns/dnsdistdist/Makefile.am index 19e57742ee291..93db389654754 100644 --- a/pdns/dnsdistdist/Makefile.am +++ b/pdns/dnsdistdist/Makefile.am @@ -156,6 +156,7 @@ dnsdist_SOURCES = \ dnsdist-discovery.cc dnsdist-discovery.hh \ dnsdist-dnscrypt.cc \ dnsdist-dnsparser.cc dnsdist-dnsparser.hh \ + dnsdist-dnsquestion.cc \ dnsdist-doh-common.cc dnsdist-doh-common.hh \ dnsdist-downstream-connection.hh \ dnsdist-dynblocks.cc dnsdist-dynblocks.hh \ @@ -280,6 +281,7 @@ testrunner_SOURCES = \ dnsdist-configuration.cc dnsdist-configuration.hh \ dnsdist-crypto.cc dnsdist-crypto.hh \ dnsdist-dnsparser.cc dnsdist-dnsparser.hh \ + dnsdist-dnsquestion.cc \ dnsdist-doh-common.cc dnsdist-doh-common.hh \ dnsdist-downstream-connection.hh \ dnsdist-dynblocks.cc dnsdist-dynblocks.hh \ @@ -554,6 +556,7 @@ fuzz_target_dnsdistcache_SOURCES = \ dnsdist-cache.cc dnsdist-cache.hh \ dnsdist-configuration.cc dnsdist-configuration.hh \ dnsdist-dnsparser.cc dnsdist-dnsparser.hh \ + dnsdist-dnsquestion.cc \ dnsdist-ecs.cc dnsdist-ecs.hh \ dnsdist-idstate.hh \ dnsdist-protocols.cc dnsdist-protocols.hh \ diff --git a/pdns/dnsdistdist/dnsdist-dnsquestion.cc b/pdns/dnsdistdist/dnsdist-dnsquestion.cc new file mode 100644 index 0000000000000..7090f56e11e2e --- /dev/null +++ b/pdns/dnsdistdist/dnsdist-dnsquestion.cc @@ -0,0 +1,60 @@ +/* + * This file is part of PowerDNS or dnsdist. + * Copyright -- PowerDNS.COM B.V. and its contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * In addition, for the avoidance of any doubt, permission is granted to + * link this program with OpenSSL and to (re)distribute the binaries + * produced as the result of such linking. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#include "dnsdist.hh" +#include "dnsdist-dnsparser.hh" + +std::string DNSQuestion::getTrailingData() const +{ + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + const auto* message = reinterpret_cast(this->getData().data()); + const uint16_t messageLen = getDNSPacketLength(message, this->getData().size()); + // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic) + return {message + messageLen, this->getData().size() - messageLen}; +} + +bool DNSQuestion::setTrailingData(const std::string& tail) +{ + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + const char* message = reinterpret_cast(this->data.data()); + const uint16_t messageLen = getDNSPacketLength(message, this->data.size()); + this->data.resize(messageLen); + if (!tail.empty()) { + if (!hasRoomFor(tail.size())) { + return false; + } + this->data.insert(this->data.end(), tail.begin(), tail.end()); + } + return true; +} + +bool DNSQuestion::editHeader(const std::function& editFunction) +{ + if (data.size() < sizeof(dnsheader)) { + throw std::runtime_error("Trying to access the dnsheader of a too small (" + std::to_string(data.size()) + ") DNSQuestion buffer"); + } + return dnsdist::PacketMangling::editDNSHeaderFromPacket(data, editFunction); +} + +DNSQuestion::DNSQuestion(InternalQueryState& ids_, PacketBuffer& data_) : + data(data_), ids(ids_), ecsPrefixLength(ids.origRemote.sin4.sin_family == AF_INET ? dnsdist::configuration::getCurrentRuntimeConfiguration().d_ECSSourcePrefixV4 : dnsdist::configuration::getCurrentRuntimeConfiguration().d_ECSSourcePrefixV6), ecsOverride(dnsdist::configuration::getCurrentRuntimeConfiguration().d_ecsOverride) +{ +} diff --git a/pdns/dnsdistdist/dnsdist.cc b/pdns/dnsdistdist/dnsdist.cc index 08d1789dcdfa1..0e1db2182c3ff 100644 --- a/pdns/dnsdistdist/dnsdist.cc +++ b/pdns/dnsdistdist/dnsdist.cc @@ -46,7 +46,6 @@ #include "dnsdist-console.hh" #include "dnsdist-crypto.hh" #include "dnsdist-discovery.hh" -#include "dnsdist-dnsparser.hh" #include "dnsdist-dynblocks.hh" #include "dnsdist-ecs.hh" #include "dnsdist-edns.hh" @@ -72,7 +71,6 @@ #include "doh.hh" #include "dolog.hh" #include "dnsname.hh" -#include "dnsparser.hh" #include "ednsoptions.hh" #include "gettime.hh" #include "lock.hh" @@ -188,38 +186,6 @@ struct DelayedPacket static std::unique_ptr> g_delay{nullptr}; #endif /* DISABLE_DELAY_PIPE */ -std::string DNSQuestion::getTrailingData() const -{ - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - const auto* message = reinterpret_cast(this->getData().data()); - const uint16_t messageLen = getDNSPacketLength(message, this->getData().size()); - // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic) - return {message + messageLen, this->getData().size() - messageLen}; -} - -bool DNSQuestion::setTrailingData(const std::string& tail) -{ - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - const char* message = reinterpret_cast(this->data.data()); - const uint16_t messageLen = getDNSPacketLength(message, this->data.size()); - this->data.resize(messageLen); - if (!tail.empty()) { - if (!hasRoomFor(tail.size())) { - return false; - } - this->data.insert(this->data.end(), tail.begin(), tail.end()); - } - return true; -} - -bool DNSQuestion::editHeader(const std::function& editFunction) -{ - if (data.size() < sizeof(dnsheader)) { - throw std::runtime_error("Trying to access the dnsheader of a too small (" + std::to_string(data.size()) + ") DNSQuestion buffer"); - } - return dnsdist::PacketMangling::editDNSHeaderFromPacket(data, editFunction); -} - static void doLatencyStats(dnsdist::Protocol protocol, double udiff) { constexpr auto doAvg = [](double& var, double n, double weight) { diff --git a/pdns/dnsdistdist/dnsdist.hh b/pdns/dnsdistdist/dnsdist.hh index ece21758c1c63..7f236f9d62845 100644 --- a/pdns/dnsdistdist/dnsdist.hh +++ b/pdns/dnsdistdist/dnsdist.hh @@ -38,7 +38,6 @@ #include "circular_buffer.hh" #include "dnscrypt.hh" #include "dnsdist-cache.hh" -#include "dnsdist-configuration.hh" #include "dnsdist-dynbpf.hh" #include "dnsdist-idstate.hh" #include "dnsdist-lbpolicies.hh" @@ -67,10 +66,7 @@ struct ClientState; struct DNSQuestion { - DNSQuestion(InternalQueryState& ids_, PacketBuffer& data_) : - data(data_), ids(ids_), ecsPrefixLength(ids.origRemote.sin4.sin_family == AF_INET ? dnsdist::configuration::getCurrentRuntimeConfiguration().d_ECSSourcePrefixV4 : dnsdist::configuration::getCurrentRuntimeConfiguration().d_ECSSourcePrefixV6), ecsOverride(dnsdist::configuration::getCurrentRuntimeConfiguration().d_ecsOverride) - { - } + DNSQuestion(InternalQueryState& ids_, PacketBuffer& data_); DNSQuestion(const DNSQuestion&) = delete; DNSQuestion& operator=(const DNSQuestion&) = delete; DNSQuestion(DNSQuestion&&) = default; diff --git a/pdns/dnsdistdist/test-dnsdist-lua-ffi.cc b/pdns/dnsdistdist/test-dnsdist-lua-ffi.cc index efd21e8d36284..c53009705126a 100644 --- a/pdns/dnsdistdist/test-dnsdist-lua-ffi.cc +++ b/pdns/dnsdistdist/test-dnsdist-lua-ffi.cc @@ -250,14 +250,11 @@ BOOST_AUTO_TEST_CASE(test_Query) { BOOST_CHECK_EQUAL(dnsdist_ffi_dnsquestion_get_trailing_data(&lightDQ, nullptr), 0U); -#if 0 - // DNSQuestion::setTrailingData() and DNSQuestion::getTrailingData() are currently stubs in the test runner std::string garbage("thisissomegarbagetrailingdata"); BOOST_CHECK_EQUAL(dnsdist_ffi_dnsquestion_set_trailing_data(&lightDQ, garbage.data(), garbage.size()), true); const char* buffer = nullptr; BOOST_REQUIRE_EQUAL(dnsdist_ffi_dnsquestion_get_trailing_data(&lightDQ, &buffer), garbage.size()); BOOST_CHECK_EQUAL(garbage, std::string(buffer)); -#endif } { diff --git a/pdns/dnsdistdist/test-dnsdistlbpolicies_cc.cc b/pdns/dnsdistdist/test-dnsdistlbpolicies_cc.cc index abe9a95c9e6e3..1eb819e491310 100644 --- a/pdns/dnsdistdist/test-dnsdistlbpolicies_cc.cc +++ b/pdns/dnsdistdist/test-dnsdistlbpolicies_cc.cc @@ -32,18 +32,6 @@ bool TLSFrontend::setupTLS() return true; } -// NOLINTNEXTLINE(readability-convert-member-functions-to-static): this is a stub, the real one is not that simple.. -std::string DNSQuestion::getTrailingData() const -{ - return ""; -} - -// NOLINTNEXTLINE(readability-convert-member-functions-to-static): this is a stub, the real one is not that simple.. -bool DNSQuestion::setTrailingData(const std::string& tail) -{ - return false; -} - // NOLINTNEXTLINE(readability-convert-member-functions-to-static): this is a stub, the real one is not that simple.. bool DNSDistSNMPAgent::sendDNSTrap(const DNSQuestion& dnsQuestion, const std::string& reason) {