From 9269c14346ddda5d8cc2aa0bca3fa17c27efae1a Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Mon, 4 Mar 2024 12:30:03 +0100 Subject: [PATCH] dnsdist: Delint test-dnsdist_cc.cc --- pdns/dnsdistdist/dnsdist-internal-queries.cc | 18 +- pdns/dnsdistdist/dnsdist-internal-queries.hh | 2 +- pdns/dnsdistdist/dnsdist.cc | 170 ++-- pdns/dnsdistdist/dnsdist.hh | 10 +- pdns/dnsdistdist/test-dnsdist_cc.cc | 964 ++++++++++--------- 5 files changed, 618 insertions(+), 546 deletions(-) diff --git a/pdns/dnsdistdist/dnsdist-internal-queries.cc b/pdns/dnsdistdist/dnsdist-internal-queries.cc index b707fefb9b..535062227d 100644 --- a/pdns/dnsdistdist/dnsdist-internal-queries.cc +++ b/pdns/dnsdistdist/dnsdist-internal-queries.cc @@ -29,34 +29,34 @@ std::unique_ptr getUDPCrossProtocolQueryFromDQ(DNSQuestion& namespace dnsdist { -std::unique_ptr getInternalQueryFromDQ(DNSQuestion& dq, bool isResponse) +std::unique_ptr getInternalQueryFromDQ(DNSQuestion& dnsQuestion, bool isResponse) { - auto protocol = dq.getProtocol(); + auto protocol = dnsQuestion.getProtocol(); if (protocol == dnsdist::Protocol::DoUDP || protocol == dnsdist::Protocol::DNSCryptUDP) { - return getUDPCrossProtocolQueryFromDQ(dq); + return getUDPCrossProtocolQueryFromDQ(dnsQuestion); } #ifdef HAVE_DNS_OVER_HTTPS else if (protocol == dnsdist::Protocol::DoH) { #ifdef HAVE_LIBH2OEVLOOP - if (dq.ids.cs->dohFrontend->d_library == "h2o") { - return getDoHCrossProtocolQueryFromDQ(dq, isResponse); + if (dnsQuestion.ids.cs->dohFrontend->d_library == "h2o") { + return getDoHCrossProtocolQueryFromDQ(dnsQuestion, isResponse); } #endif /* HAVE_LIBH2OEVLOOP */ - return getTCPCrossProtocolQueryFromDQ(dq); + return getTCPCrossProtocolQueryFromDQ(dnsQuestion); } #endif #ifdef HAVE_DNS_OVER_QUIC else if (protocol == dnsdist::Protocol::DoQ) { - return getDOQCrossProtocolQueryFromDQ(dq, isResponse); + return getDOQCrossProtocolQueryFromDQ(dnsQuestion, isResponse); } #endif #ifdef HAVE_DNS_OVER_HTTP3 else if (protocol == dnsdist::Protocol::DoH3) { - return getDOH3CrossProtocolQueryFromDQ(dq, isResponse); + return getDOH3CrossProtocolQueryFromDQ(dnsQuestion, isResponse); } #endif else { - return getTCPCrossProtocolQueryFromDQ(dq); + return getTCPCrossProtocolQueryFromDQ(dnsQuestion); } } } diff --git a/pdns/dnsdistdist/dnsdist-internal-queries.hh b/pdns/dnsdistdist/dnsdist-internal-queries.hh index 46634aa11a..331f44d1a7 100644 --- a/pdns/dnsdistdist/dnsdist-internal-queries.hh +++ b/pdns/dnsdistdist/dnsdist-internal-queries.hh @@ -26,5 +26,5 @@ namespace dnsdist { -std::unique_ptr getInternalQueryFromDQ(DNSQuestion& dq, bool isResponse); +std::unique_ptr getInternalQueryFromDQ(DNSQuestion& dnsQuestion, bool isResponse); } diff --git a/pdns/dnsdistdist/dnsdist.cc b/pdns/dnsdistdist/dnsdist.cc index 97f834ffd9..089f7ef007 100644 --- a/pdns/dnsdistdist/dnsdist.cc +++ b/pdns/dnsdistdist/dnsdist.cc @@ -567,15 +567,15 @@ static bool applyRulesToResponse(const std::vector& r return true; } -bool processResponseAfterRules(PacketBuffer& response, const std::vector& cacheInsertedRespRuleActions, DNSResponse& dr, bool muted) +bool processResponseAfterRules(PacketBuffer& response, const std::vector& cacheInsertedRespRuleActions, DNSResponse& dnsResponse, bool muted) { bool zeroScope = false; - if (!fixUpResponse(response, dr.ids.qname, dr.ids.origFlags, dr.ids.ednsAdded, dr.ids.ecsAdded, dr.ids.useZeroScope ? &zeroScope : nullptr)) { + if (!fixUpResponse(response, dnsResponse.ids.qname, dnsResponse.ids.origFlags, dnsResponse.ids.ednsAdded, dnsResponse.ids.ecsAdded, dnsResponse.ids.useZeroScope ? &zeroScope : nullptr)) { return false; } - if (dr.ids.packetCache && !dr.ids.selfGenerated && !dr.ids.skipCache && (!dr.ids.forwardedOverUDP || response.size() <= s_maxUDPResponsePacketSize)) { - if (!dr.ids.useZeroScope) { + if (dnsResponse.ids.packetCache && !dnsResponse.ids.selfGenerated && !dnsResponse.ids.skipCache && (!dnsResponse.ids.forwardedOverUDP || response.size() <= s_maxUDPResponsePacketSize)) { + if (!dnsResponse.ids.useZeroScope) { /* if the query was not suitable for zero-scope, for example because it had an existing ECS entry so the hash is not really 'no ECS', so just insert it for the existing subnet @@ -586,35 +586,35 @@ bool processResponseAfterRules(PacketBuffer& response, const std::vectorinsert(cacheKey, zeroScope ? boost::none : dr.ids.subnet, dr.ids.cacheFlags, dr.ids.dnssecOK, dr.ids.qname, dr.ids.qtype, dr.ids.qclass, response, dr.ids.forwardedOverUDP, dr.getHeader()->rcode, dr.ids.tempFailureTTL); + dnsResponse.ids.packetCache->insert(cacheKey, zeroScope ? boost::none : dnsResponse.ids.subnet, dnsResponse.ids.cacheFlags, dnsResponse.ids.dnssecOK, dnsResponse.ids.qname, dnsResponse.ids.qtype, dnsResponse.ids.qclass, response, dnsResponse.ids.forwardedOverUDP, dnsResponse.getHeader()->rcode, dnsResponse.ids.tempFailureTTL); - if (!applyRulesToResponse(cacheInsertedRespRuleActions, dr)) { + if (!applyRulesToResponse(cacheInsertedRespRuleActions, dnsResponse)) { return false; } } - if (dr.ids.ttlCap > 0) { + if (dnsResponse.ids.ttlCap > 0) { std::string result; - LimitTTLResponseAction ac(0, dr.ids.ttlCap, {}); - ac(&dr, &result); + LimitTTLResponseAction ac(0, dnsResponse.ids.ttlCap, {}); + ac(&dnsResponse, &result); } - if (dr.ids.d_extendedError) { - dnsdist::edns::addExtendedDNSError(dr.getMutableData(), dr.getMaximumSize(), dr.ids.d_extendedError->infoCode, dr.ids.d_extendedError->extraText); + if (dnsResponse.ids.d_extendedError) { + dnsdist::edns::addExtendedDNSError(dnsResponse.getMutableData(), dnsResponse.getMaximumSize(), dnsResponse.ids.d_extendedError->infoCode, dnsResponse.ids.d_extendedError->extraText); } #ifdef HAVE_DNSCRYPT if (!muted) { - if (!encryptResponse(response, dr.getMaximumSize(), dr.overTCP(), dr.ids.dnsCryptQuery)) { + if (!encryptResponse(response, dnsResponse.getMaximumSize(), dnsResponse.overTCP(), dnsResponse.ids.dnsCryptQuery)) { return false; } } @@ -623,17 +623,17 @@ bool processResponseAfterRules(PacketBuffer& response, const std::vector& respRuleActions, const std::vector& cacheInsertedRespRuleActions, DNSResponse& dr, bool muted) +bool processResponse(PacketBuffer& response, const std::vector& respRuleActions, const std::vector& cacheInsertedRespRuleActions, DNSResponse& dnsResponse, bool muted) { - if (!applyRulesToResponse(respRuleActions, dr)) { + if (!applyRulesToResponse(respRuleActions, dnsResponse)) { return false; } - if (dr.isAsynchronous()) { + if (dnsResponse.isAsynchronous()) { return true; } - return processResponseAfterRules(response, cacheInsertedRespRuleActions, dr, muted); + return processResponseAfterRules(response, cacheInsertedRespRuleActions, dnsResponse, muted); } static size_t getInitialUDPPacketBufferSize(bool expectProxyProtocol) @@ -961,14 +961,14 @@ static void spoofPacketFromString(DNSQuestion& dq, const string& spoofContent) tempSpoofAction(&dq, &result); } -bool processRulesResult(const DNSAction::Action& action, DNSQuestion& dq, std::string& ruleresult, bool& drop) +bool processRulesResult(const DNSAction::Action& action, DNSQuestion& dnsQuestion, std::string& ruleresult, bool& drop) { - if (dq.isAsynchronous()) { + if (dnsQuestion.isAsynchronous()) { return false; } - auto setRCode = [&dq](uint8_t rcode) { - dnsdist::PacketMangling::editDNSHeaderFromPacket(dq.getMutableData(), [rcode](dnsheader& header) { + auto setRCode = [&dnsQuestion](uint8_t rcode) { + dnsdist::PacketMangling::editDNSHeaderFromPacket(dnsQuestion.getMutableData(), [rcode](dnsheader& header) { header.rcode = rcode; header.qr = true; return true; @@ -997,20 +997,20 @@ bool processRulesResult(const DNSAction::Action& action, DNSQuestion& dq, std::s return true; break; case DNSAction::Action::Spoof: - spoofResponseFromString(dq, ruleresult, false); + spoofResponseFromString(dnsQuestion, ruleresult, false); return true; break; case DNSAction::Action::SpoofPacket: - spoofPacketFromString(dq, ruleresult); + spoofPacketFromString(dnsQuestion, ruleresult); return true; break; case DNSAction::Action::SpoofRaw: - spoofResponseFromString(dq, ruleresult, true); + spoofResponseFromString(dnsQuestion, ruleresult, true); return true; break; case DNSAction::Action::Truncate: - if (!dq.overTCP()) { - dnsdist::PacketMangling::editDNSHeaderFromPacket(dq.getMutableData(), [](dnsheader& header) { + if (!dnsQuestion.overTCP()) { + dnsdist::PacketMangling::editDNSHeaderFromPacket(dnsQuestion.getMutableData(), [](dnsheader& header) { header.tc = true; header.qr = true; header.ra = header.rd; @@ -1028,11 +1028,11 @@ bool processRulesResult(const DNSAction::Action& action, DNSQuestion& dq, std::s case DNSAction::Action::Pool: /* we need to keep this because a custom Lua action can return DNSAction.Spoof, 'poolname' */ - dq.ids.poolName = ruleresult; + dnsQuestion.ids.poolName = ruleresult; return true; break; case DNSAction::Action::NoRecurse: - dnsdist::PacketMangling::editDNSHeaderFromPacket(dq.getMutableData(), [](dnsheader& header) { + dnsdist::PacketMangling::editDNSHeaderFromPacket(dnsQuestion.getMutableData(), [](dnsheader& header) { header.rd = false; return true; }); @@ -1040,7 +1040,7 @@ bool processRulesResult(const DNSAction::Action& action, DNSQuestion& dq, std::s break; /* non-terminal actions follow */ case DNSAction::Action::Delay: - pdns::checked_stoi_into(dq.ids.delayMsec, ruleresult); // sorry + pdns::checked_stoi_into(dnsQuestion.ids.delayMsec, ruleresult); // sorry break; case DNSAction::Action::None: /* fall-through */ @@ -1416,19 +1416,19 @@ static bool prepareOutgoingResponse(LocalHolders& holders, const ClientState& cs return true; } -ProcessQueryResult processQueryAfterRules(DNSQuestion& dq, LocalHolders& holders, std::shared_ptr& selectedBackend) +ProcessQueryResult processQueryAfterRules(DNSQuestion& dnsQuestion, LocalHolders& holders, std::shared_ptr& selectedBackend) { - const uint16_t queryId = ntohs(dq.getHeader()->id); + const uint16_t queryId = ntohs(dnsQuestion.getHeader()->id); try { - if (dq.getHeader()->qr) { // something turned it into a response - fixUpQueryTurnedResponse(dq, dq.ids.origFlags); + if (dnsQuestion.getHeader()->qr) { // something turned it into a response + fixUpQueryTurnedResponse(dnsQuestion, dnsQuestion.ids.origFlags); - if (!prepareOutgoingResponse(holders, *dq.ids.cs, dq, false)) { + if (!prepareOutgoingResponse(holders, *dnsQuestion.ids.cs, dnsQuestion, false)) { return ProcessQueryResult::Drop; } - const auto rcode = dq.getHeader()->rcode; + const auto rcode = dnsQuestion.getHeader()->rcode; if (rcode == RCode::NXDomain) { ++dnsdist::metrics::g_stats.ruleNXDomain; } @@ -1440,91 +1440,91 @@ ProcessQueryResult processQueryAfterRules(DNSQuestion& dq, LocalHolders& holders } ++dnsdist::metrics::g_stats.selfAnswered; - ++dq.ids.cs->responses; + ++dnsQuestion.ids.cs->responses; return ProcessQueryResult::SendAnswer; } - std::shared_ptr serverPool = getPool(*holders.pools, dq.ids.poolName); + std::shared_ptr serverPool = getPool(*holders.pools, dnsQuestion.ids.poolName); std::shared_ptr poolPolicy = serverPool->policy; - dq.ids.packetCache = serverPool->packetCache; + dnsQuestion.ids.packetCache = serverPool->packetCache; const auto& policy = poolPolicy != nullptr ? *poolPolicy : *(holders.policy); const auto servers = serverPool->getServers(); - selectedBackend = policy.getSelectedBackend(*servers, dq); + selectedBackend = policy.getSelectedBackend(*servers, dnsQuestion); uint32_t allowExpired = selectedBackend ? 0 : g_staleCacheEntriesTTL; - if (dq.ids.packetCache && !dq.ids.skipCache) { - dq.ids.dnssecOK = (getEDNSZ(dq) & EDNS_HEADER_FLAG_DO); + if (dnsQuestion.ids.packetCache && !dnsQuestion.ids.skipCache) { + dnsQuestion.ids.dnssecOK = (getEDNSZ(dnsQuestion) & EDNS_HEADER_FLAG_DO); } - if (dq.useECS && ((selectedBackend && selectedBackend->d_config.useECS) || (!selectedBackend && serverPool->getECS()))) { + if (dnsQuestion.useECS && ((selectedBackend && selectedBackend->d_config.useECS) || (!selectedBackend && serverPool->getECS()))) { // we special case our cache in case a downstream explicitly gave us a universally valid response with a 0 scope // we need ECS parsing (parseECS) to be true so we can be sure that the initial incoming query did not have an existing // ECS option, which would make it unsuitable for the zero-scope feature. - if (dq.ids.packetCache && !dq.ids.skipCache && (!selectedBackend || !selectedBackend->d_config.disableZeroScope) && dq.ids.packetCache->isECSParsingEnabled()) { - if (dq.ids.packetCache->get(dq, dq.getHeader()->id, &dq.ids.cacheKeyNoECS, dq.ids.subnet, dq.ids.dnssecOK, !dq.overTCP(), allowExpired, false, true, false)) { + if (dnsQuestion.ids.packetCache && !dnsQuestion.ids.skipCache && (!selectedBackend || !selectedBackend->d_config.disableZeroScope) && dnsQuestion.ids.packetCache->isECSParsingEnabled()) { + if (dnsQuestion.ids.packetCache->get(dnsQuestion, dnsQuestion.getHeader()->id, &dnsQuestion.ids.cacheKeyNoECS, dnsQuestion.ids.subnet, dnsQuestion.ids.dnssecOK, !dnsQuestion.overTCP(), allowExpired, false, true, false)) { - vinfolog("Packet cache hit for query for %s|%s from %s (%s, %d bytes)", dq.ids.qname.toLogString(), QType(dq.ids.qtype).toString(), dq.ids.origRemote.toStringWithPort(), dq.ids.protocol.toString(), dq.getData().size()); + vinfolog("Packet cache hit for query for %s|%s from %s (%s, %d bytes)", dnsQuestion.ids.qname.toLogString(), QType(dnsQuestion.ids.qtype).toString(), dnsQuestion.ids.origRemote.toStringWithPort(), dnsQuestion.ids.protocol.toString(), dnsQuestion.getData().size()); - if (!prepareOutgoingResponse(holders, *dq.ids.cs, dq, true)) { + if (!prepareOutgoingResponse(holders, *dnsQuestion.ids.cs, dnsQuestion, true)) { return ProcessQueryResult::Drop; } ++dnsdist::metrics::g_stats.responses; - ++dq.ids.cs->responses; + ++dnsQuestion.ids.cs->responses; return ProcessQueryResult::SendAnswer; } - if (!dq.ids.subnet) { + if (!dnsQuestion.ids.subnet) { /* there was no existing ECS on the query, enable the zero-scope feature */ - dq.ids.useZeroScope = true; + dnsQuestion.ids.useZeroScope = true; } } - if (!handleEDNSClientSubnet(dq, dq.ids.ednsAdded, dq.ids.ecsAdded)) { - vinfolog("Dropping query from %s because we couldn't insert the ECS value", dq.ids.origRemote.toStringWithPort()); + if (!handleEDNSClientSubnet(dnsQuestion, dnsQuestion.ids.ednsAdded, dnsQuestion.ids.ecsAdded)) { + vinfolog("Dropping query from %s because we couldn't insert the ECS value", dnsQuestion.ids.origRemote.toStringWithPort()); return ProcessQueryResult::Drop; } } - if (dq.ids.packetCache && !dq.ids.skipCache) { - bool forwardedOverUDP = !dq.overTCP(); + if (dnsQuestion.ids.packetCache && !dnsQuestion.ids.skipCache) { + bool forwardedOverUDP = !dnsQuestion.overTCP(); if (selectedBackend && selectedBackend->isTCPOnly()) { forwardedOverUDP = false; } /* we do not record a miss for queries received over DoH and forwarded over TCP yet, as we will do a second-lookup */ - if (dq.ids.packetCache->get(dq, dq.getHeader()->id, &dq.ids.cacheKey, dq.ids.subnet, dq.ids.dnssecOK, forwardedOverUDP, allowExpired, false, true, dq.ids.protocol != dnsdist::Protocol::DoH || forwardedOverUDP)) { + if (dnsQuestion.ids.packetCache->get(dnsQuestion, dnsQuestion.getHeader()->id, &dnsQuestion.ids.cacheKey, dnsQuestion.ids.subnet, dnsQuestion.ids.dnssecOK, forwardedOverUDP, allowExpired, false, true, dnsQuestion.ids.protocol != dnsdist::Protocol::DoH || forwardedOverUDP)) { - dnsdist::PacketMangling::editDNSHeaderFromPacket(dq.getMutableData(), [flags = dq.ids.origFlags](dnsheader& header) { + dnsdist::PacketMangling::editDNSHeaderFromPacket(dnsQuestion.getMutableData(), [flags = dnsQuestion.ids.origFlags](dnsheader& header) { restoreFlags(&header, flags); return true; }); - vinfolog("Packet cache hit for query for %s|%s from %s (%s, %d bytes)", dq.ids.qname.toLogString(), QType(dq.ids.qtype).toString(), dq.ids.origRemote.toStringWithPort(), dq.ids.protocol.toString(), dq.getData().size()); + vinfolog("Packet cache hit for query for %s|%s from %s (%s, %d bytes)", dnsQuestion.ids.qname.toLogString(), QType(dnsQuestion.ids.qtype).toString(), dnsQuestion.ids.origRemote.toStringWithPort(), dnsQuestion.ids.protocol.toString(), dnsQuestion.getData().size()); - if (!prepareOutgoingResponse(holders, *dq.ids.cs, dq, true)) { + if (!prepareOutgoingResponse(holders, *dnsQuestion.ids.cs, dnsQuestion, true)) { return ProcessQueryResult::Drop; } ++dnsdist::metrics::g_stats.responses; - ++dq.ids.cs->responses; + ++dnsQuestion.ids.cs->responses; return ProcessQueryResult::SendAnswer; } - else if (dq.ids.protocol == dnsdist::Protocol::DoH && !forwardedOverUDP) { + else if (dnsQuestion.ids.protocol == dnsdist::Protocol::DoH && !forwardedOverUDP) { /* do a second-lookup for UDP responses, but we do not want TC=1 answers */ - if (dq.ids.packetCache->get(dq, dq.getHeader()->id, &dq.ids.cacheKeyUDP, dq.ids.subnet, dq.ids.dnssecOK, true, allowExpired, false, false, true)) { - if (!prepareOutgoingResponse(holders, *dq.ids.cs, dq, true)) { + if (dnsQuestion.ids.packetCache->get(dnsQuestion, dnsQuestion.getHeader()->id, &dnsQuestion.ids.cacheKeyUDP, dnsQuestion.ids.subnet, dnsQuestion.ids.dnssecOK, true, allowExpired, false, false, true)) { + if (!prepareOutgoingResponse(holders, *dnsQuestion.ids.cs, dnsQuestion, true)) { return ProcessQueryResult::Drop; } ++dnsdist::metrics::g_stats.responses; - ++dq.ids.cs->responses; + ++dnsQuestion.ids.cs->responses; return ProcessQueryResult::SendAnswer; } } - vinfolog("Packet cache miss for query for %s|%s from %s (%s, %d bytes)", dq.ids.qname.toLogString(), QType(dq.ids.qtype).toString(), dq.ids.origRemote.toStringWithPort(), dq.ids.protocol.toString(), dq.getData().size()); + vinfolog("Packet cache miss for query for %s|%s from %s (%s, %d bytes)", dnsQuestion.ids.qname.toLogString(), QType(dnsQuestion.ids.qtype).toString(), dnsQuestion.ids.origRemote.toStringWithPort(), dnsQuestion.ids.protocol.toString(), dnsQuestion.getData().size()); ++dnsdist::metrics::g_stats.cacheMisses; } @@ -1532,21 +1532,21 @@ ProcessQueryResult processQueryAfterRules(DNSQuestion& dq, LocalHolders& holders if (!selectedBackend) { ++dnsdist::metrics::g_stats.noPolicy; - vinfolog("%s query for %s|%s from %s, no downstream server available", g_servFailOnNoPolicy ? "ServFailed" : "Dropped", dq.ids.qname.toLogString(), QType(dq.ids.qtype).toString(), dq.ids.origRemote.toStringWithPort()); + vinfolog("%s query for %s|%s from %s, no downstream server available", g_servFailOnNoPolicy ? "ServFailed" : "Dropped", dnsQuestion.ids.qname.toLogString(), QType(dnsQuestion.ids.qtype).toString(), dnsQuestion.ids.origRemote.toStringWithPort()); if (g_servFailOnNoPolicy) { - dnsdist::PacketMangling::editDNSHeaderFromPacket(dq.getMutableData(), [](dnsheader& header) { + dnsdist::PacketMangling::editDNSHeaderFromPacket(dnsQuestion.getMutableData(), [](dnsheader& header) { header.rcode = RCode::ServFail; header.qr = true; return true; }); - fixUpQueryTurnedResponse(dq, dq.ids.origFlags); + fixUpQueryTurnedResponse(dnsQuestion, dnsQuestion.ids.origFlags); - if (!prepareOutgoingResponse(holders, *dq.ids.cs, dq, false)) { + if (!prepareOutgoingResponse(holders, *dnsQuestion.ids.cs, dnsQuestion, false)) { return ProcessQueryResult::Drop; } ++dnsdist::metrics::g_stats.responses; - ++dq.ids.cs->responses; + ++dnsQuestion.ids.cs->responses; // no response-only statistics counter to update. return ProcessQueryResult::SendAnswer; } @@ -1555,24 +1555,24 @@ ProcessQueryResult processQueryAfterRules(DNSQuestion& dq, LocalHolders& holders } /* save the DNS flags as sent to the backend so we can cache the answer with the right flags later */ - dq.ids.cacheFlags = *getFlagsFromDNSHeader(dq.getHeader().get()); + dnsQuestion.ids.cacheFlags = *getFlagsFromDNSHeader(dnsQuestion.getHeader().get()); - if (dq.addXPF && selectedBackend->d_config.xpfRRCode != 0) { - addXPF(dq, selectedBackend->d_config.xpfRRCode); + if (dnsQuestion.addXPF && selectedBackend->d_config.xpfRRCode != 0) { + addXPF(dnsQuestion, selectedBackend->d_config.xpfRRCode); } - if (selectedBackend->d_config.useProxyProtocol && dq.getProtocol().isEncrypted() && selectedBackend->d_config.d_proxyProtocolAdvertiseTLS) { - if (!dq.proxyProtocolValues) { - dq.proxyProtocolValues = std::make_unique>(); + if (selectedBackend->d_config.useProxyProtocol && dnsQuestion.getProtocol().isEncrypted() && selectedBackend->d_config.d_proxyProtocolAdvertiseTLS) { + if (!dnsQuestion.proxyProtocolValues) { + dnsQuestion.proxyProtocolValues = std::make_unique>(); } - dq.proxyProtocolValues->push_back(ProxyProtocolValue{"", static_cast(ProxyProtocolValue::Types::PP_TLV_SSL)}); + dnsQuestion.proxyProtocolValues->push_back(ProxyProtocolValue{"", static_cast(ProxyProtocolValue::Types::PP_TLV_SSL)}); } selectedBackend->incQueriesCount(); return ProcessQueryResult::PassToBackend; } catch (const std::exception& e) { - vinfolog("Got an error while parsing a %s query (after applying rules) from %s, id %d: %s", (dq.overTCP() ? "TCP" : "UDP"), dq.ids.origRemote.toStringWithPort(), queryId, e.what()); + vinfolog("Got an error while parsing a %s query (after applying rules) from %s, id %d: %s", (dnsQuestion.overTCP() ? "TCP" : "UDP"), dnsQuestion.ids.origRemote.toStringWithPort(), queryId, e.what()); } return ProcessQueryResult::Drop; } @@ -1658,9 +1658,9 @@ std::unique_ptr getUDPCrossProtocolQueryFromDQ(DNSQuestion& return std::make_unique(std::move(dq.getMutableData()), std::move(dq.ids), nullptr); } -ProcessQueryResult processQuery(DNSQuestion& dq, LocalHolders& holders, std::shared_ptr& selectedBackend) +ProcessQueryResult processQuery(DNSQuestion& dnsQuestion, LocalHolders& holders, std::shared_ptr& selectedBackend) { - const uint16_t queryId = ntohs(dq.getHeader()->id); + const uint16_t queryId = ntohs(dnsQuestion.getHeader()->id); try { /* we need an accurate ("real") value for the response and @@ -1669,18 +1669,18 @@ ProcessQueryResult processQuery(DNSQuestion& dq, LocalHolders& holders, std::sha struct timespec now; gettime(&now); - if (!applyRulesToQuery(holders, dq, now)) { + if (!applyRulesToQuery(holders, dnsQuestion, now)) { return ProcessQueryResult::Drop; } - if (dq.isAsynchronous()) { + if (dnsQuestion.isAsynchronous()) { return ProcessQueryResult::Asynchronous; } - return processQueryAfterRules(dq, holders, selectedBackend); + return processQueryAfterRules(dnsQuestion, holders, selectedBackend); } catch (const std::exception& e) { - vinfolog("Got an error while parsing a %s query from %s, id %d: %s", (dq.overTCP() ? "TCP" : "UDP"), dq.ids.origRemote.toStringWithPort(), queryId, e.what()); + vinfolog("Got an error while parsing a %s query from %s, id %d: %s", (dnsQuestion.overTCP() ? "TCP" : "UDP"), dnsQuestion.ids.origRemote.toStringWithPort(), queryId, e.what()); } return ProcessQueryResult::Drop; } diff --git a/pdns/dnsdistdist/dnsdist.hh b/pdns/dnsdistdist/dnsdist.hh index e345614be5..064e0e8678 100644 --- a/pdns/dnsdistdist/dnsdist.hh +++ b/pdns/dnsdistdist/dnsdist.hh @@ -1261,11 +1261,11 @@ enum class ProcessQueryResult : uint8_t PassToBackend, Asynchronous }; -ProcessQueryResult processQuery(DNSQuestion& dq, LocalHolders& holders, std::shared_ptr& selectedBackend); -ProcessQueryResult processQueryAfterRules(DNSQuestion& dq, LocalHolders& holders, std::shared_ptr& selectedBackend); -bool processResponse(PacketBuffer& response, const std::vector& respRuleActions, const std::vector& insertedRespRuleActions, DNSResponse& dr, bool muted); -bool processRulesResult(const DNSAction::Action& action, DNSQuestion& dq, std::string& ruleresult, bool& drop); -bool processResponseAfterRules(PacketBuffer& response, const std::vector& cacheInsertedRespRuleActions, DNSResponse& dr, bool muted); +ProcessQueryResult processQuery(DNSQuestion& dnsQuestion, LocalHolders& holders, std::shared_ptr& selectedBackend); +ProcessQueryResult processQueryAfterRules(DNSQuestion& dnsQuestion, LocalHolders& holders, std::shared_ptr& selectedBackend); +bool processResponse(PacketBuffer& response, const std::vector& respRuleActions, const std::vector& insertedRespRuleActions, DNSResponse& dnsResponse, bool muted); +bool processRulesResult(const DNSAction::Action& action, DNSQuestion& dnsQuestion, std::string& ruleresult, bool& drop); +bool processResponseAfterRules(PacketBuffer& response, const std::vector& cacheInsertedRespRuleActions, DNSResponse& dnsResponse, bool muted); bool processResponderPacket(std::shared_ptr& dss, PacketBuffer& response, const std::vector& localRespRuleActions, const std::vector& cacheInsertedRespRuleActions, InternalQueryState&& ids); bool assignOutgoingUDPQueryToBackend(std::shared_ptr& downstream, uint16_t queryID, DNSQuestion& dnsQuestion, PacketBuffer& query, bool actuallySend = true); diff --git a/pdns/dnsdistdist/test-dnsdist_cc.cc b/pdns/dnsdistdist/test-dnsdist_cc.cc index 1254c7e357..79fcd5e8fc 100644 --- a/pdns/dnsdistdist/test-dnsdist_cc.cc +++ b/pdns/dnsdistdist/test-dnsdist_cc.cc @@ -43,12 +43,12 @@ #include "ednscookies.hh" #include "ednssubnet.hh" -ProcessQueryResult processQueryAfterRules(DNSQuestion& dq, LocalHolders& holders, std::shared_ptr& selectedBackend) +ProcessQueryResult processQueryAfterRules(DNSQuestion& dnsQuestion, LocalHolders& holders, std::shared_ptr& selectedBackend) { return ProcessQueryResult::Drop; } -bool processResponseAfterRules(PacketBuffer& response, const std::vector& cacheInsertedRespRuleActions, DNSResponse& dr, bool muted) +bool processResponseAfterRules(PacketBuffer& response, const std::vector& cacheInsertedRespRuleActions, DNSResponse& dnsResponse, bool muted) { return false; } @@ -65,13 +65,14 @@ bool assignOutgoingUDPQueryToBackend(std::shared_ptr& downstrea namespace dnsdist { -std::unique_ptr getInternalQueryFromDQ(DNSQuestion& dq, bool isResponse) +std::unique_ptr getInternalQueryFromDQ(DNSQuestion& dnsQuestion, bool isResponse) { return nullptr; } } -bool DNSDistSNMPAgent::sendBackendStatusChangeTrap(DownstreamState const&) +// NOLINTNEXTLINE(readability-convert-member-functions-to-static): only a stub +bool DNSDistSNMPAgent::sendBackendStatusChangeTrap([[maybe_unused]] DownstreamState const& backend) { return false; } @@ -95,6 +96,7 @@ static const uint16_t ECSSourcePrefixV6 = 56; static void validateQuery(const PacketBuffer& packet, bool hasEdns = true, bool hasXPF = false, uint16_t additionals = 0, uint16_t answers = 0, uint16_t authorities = 0) { + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) MOADNSParser mdp(true, reinterpret_cast(packet.data()), packet.size()); BOOST_CHECK_EQUAL(mdp.d_qname.toString(), "www.powerdns.com."); @@ -111,13 +113,15 @@ static void validateECS(const PacketBuffer& packet, const ComboAddress& expected InternalQueryState ids; ids.protocol = dnsdist::Protocol::DoUDP; ids.origRemote = ComboAddress("::1"); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) ids.qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &ids.qtype, &ids.qclass); - DNSQuestion dq(ids, const_cast(packet)); - BOOST_CHECK(parseEDNSOptions(dq)); - BOOST_REQUIRE(dq.ednsOptions != nullptr); - BOOST_CHECK_EQUAL(dq.ednsOptions->size(), 1U); - const auto& ecsOption = dq.ednsOptions->find(EDNSOptionCode::ECS); - BOOST_REQUIRE(ecsOption != dq.ednsOptions->cend()); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-const-cast) + DNSQuestion dnsQuestion(ids, const_cast(packet)); + BOOST_CHECK(parseEDNSOptions(dnsQuestion)); + BOOST_REQUIRE(dnsQuestion.ednsOptions != nullptr); + BOOST_CHECK_EQUAL(dnsQuestion.ednsOptions->size(), 1U); + const auto& ecsOption = dnsQuestion.ednsOptions->find(EDNSOptionCode::ECS); + BOOST_REQUIRE(ecsOption != dnsQuestion.ednsOptions->cend()); string expectedOption; generateECSOption(expected, expectedOption, expected.sin4.sin_family == AF_INET ? ECSSourcePrefixV4 : ECSSourcePrefixV6); @@ -128,6 +132,7 @@ static void validateECS(const PacketBuffer& packet, const ComboAddress& expected static void validateResponse(const PacketBuffer& packet, bool hasEdns, uint8_t additionalCount = 0) { + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) MOADNSParser mdp(false, reinterpret_cast(packet.data()), packet.size()); BOOST_CHECK_EQUAL(mdp.d_qname.toString(), "www.powerdns.com."); @@ -150,20 +155,22 @@ BOOST_AUTO_TEST_CASE(test_addXPF) ids.origDest = ComboAddress("::1"); PacketBuffer query; - GenericDNSPacketWriter pw(query, name, QType::A, QClass::IN, 0); - pw.getHeader()->rd = 1; + GenericDNSPacketWriter packetWriter(query, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->rd = 1; PacketBuffer queryWithXPF; { PacketBuffer packet = query; /* large enough packet */ + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) ids.qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &ids.qtype, &ids.qclass); - DNSQuestion dq(ids, const_cast(packet)); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-const-cast) + DNSQuestion dnsQuestion(ids, const_cast(packet)); BOOST_CHECK_EQUAL(ids.qname, name); BOOST_CHECK(ids.qtype == QType::A); - BOOST_CHECK(addXPF(dq, xpfOptionCode)); + BOOST_CHECK(addXPF(dnsQuestion, xpfOptionCode)); BOOST_CHECK(packet.size() > query.size()); validateQuery(packet, false, true); queryWithXPF = packet; @@ -174,12 +181,14 @@ BOOST_AUTO_TEST_CASE(test_addXPF) /* packet is already too large for the 4096 limit over UDP */ packet.resize(4096); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) ids.qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &ids.qtype, &ids.qclass); - DNSQuestion dq(ids, const_cast(packet)); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-const-cast) + DNSQuestion dnsQuestion(ids, const_cast(packet)); BOOST_CHECK_EQUAL(ids.qname, name); BOOST_CHECK(ids.qtype == QType::A); - BOOST_REQUIRE(!addXPF(dq, xpfOptionCode)); + BOOST_REQUIRE(!addXPF(dnsQuestion, xpfOptionCode)); BOOST_CHECK_EQUAL(packet.size(), 4096U); packet.resize(query.size()); validateQuery(packet, false, false); @@ -189,8 +198,10 @@ BOOST_AUTO_TEST_CASE(test_addXPF) PacketBuffer packet = query; /* packet with trailing data (overriding it) */ + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) ids.qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &ids.qtype, &ids.qclass); - DNSQuestion dq(ids, const_cast(packet)); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-const-cast) + DNSQuestion dnsQuestion(ids, const_cast(packet)); BOOST_CHECK_EQUAL(ids.qname, name); BOOST_CHECK(ids.qtype == QType::A); @@ -202,7 +213,7 @@ BOOST_AUTO_TEST_CASE(test_addXPF) packet.push_back('A'); } - BOOST_CHECK(addXPF(dq, xpfOptionCode)); + BOOST_CHECK(addXPF(dnsQuestion, xpfOptionCode)); BOOST_CHECK_EQUAL(packet.size(), queryWithXPF.size()); BOOST_CHECK_EQUAL(memcmp(queryWithXPF.data(), packet.data(), queryWithXPF.size()), 0); validateQuery(packet, false, true); @@ -219,15 +230,16 @@ BOOST_AUTO_TEST_CASE(addECSWithoutEDNS) generateECSOption(remote, newECSOption, remote.sin4.sin_family == AF_INET ? ECSSourcePrefixV4 : ECSSourcePrefixV6); PacketBuffer query; - GenericDNSPacketWriter pw(query, name, QType::A, QClass::IN, 0); - pw.getHeader()->rd = 1; + GenericDNSPacketWriter packetWriter(query, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->rd = 1; uint16_t len = query.size(); /* large enough packet */ PacketBuffer packet = query; unsigned int consumed = 0; - uint16_t qtype; + uint16_t qtype = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) DNSName qname(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -246,6 +258,7 @@ BOOST_AUTO_TEST_CASE(addECSWithoutEDNS) ednsAdded = false; ecsAdded = false; consumed = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -261,6 +274,7 @@ BOOST_AUTO_TEST_CASE(addECSWithoutEDNS) ednsAdded = false; ecsAdded = false; consumed = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -294,18 +308,19 @@ BOOST_AUTO_TEST_CASE(addECSWithoutEDNSButWithAnswer) generateECSOption(remote, newECSOption, remote.sin4.sin_family == AF_INET ? ECSSourcePrefixV4 : ECSSourcePrefixV6); PacketBuffer query; - GenericDNSPacketWriter pw(query, name, QType::A, QClass::IN, 0); - pw.getHeader()->rd = 1; - pw.startRecord(name, QType::A, 60, QClass::IN, DNSResourceRecord::ANSWER, false); - pw.xfrIP(remote.sin4.sin_addr.s_addr); - pw.commit(); + GenericDNSPacketWriter packetWriter(query, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->rd = 1; + packetWriter.startRecord(name, QType::A, 60, QClass::IN, DNSResourceRecord::ANSWER, false); + packetWriter.xfrIP(remote.sin4.sin_addr.s_addr); + packetWriter.commit(); uint16_t len = query.size(); /* large enough packet */ PacketBuffer packet = query; unsigned int consumed = 0; - uint16_t qtype; + uint16_t qtype = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) DNSName qname(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -324,6 +339,7 @@ BOOST_AUTO_TEST_CASE(addECSWithoutEDNSButWithAnswer) ednsAdded = false; ecsAdded = false; consumed = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -339,6 +355,7 @@ BOOST_AUTO_TEST_CASE(addECSWithoutEDNSButWithAnswer) ednsAdded = false; ecsAdded = false; consumed = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -368,22 +385,22 @@ BOOST_AUTO_TEST_CASE(addECSWithoutEDNSAlreadyParsed) DNSName name("www.powerdns.com."); PacketBuffer query; - GenericDNSPacketWriter pw(query, name, QType::A, QClass::IN, 0); - pw.getHeader()->rd = 1; + GenericDNSPacketWriter packetWriter(query, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->rd = 1; auto packet = query; - + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) ids.qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &ids.qtype, &ids.qclass); BOOST_CHECK_EQUAL(ids.qname, name); BOOST_CHECK(ids.qtype == QType::A); BOOST_CHECK(ids.qclass == QClass::IN); - DNSQuestion dq(ids, packet); + DNSQuestion dnsQuestion(ids, packet); /* Parse the options before handling ECS, simulating a Lua rule asking for EDNS Options */ - BOOST_CHECK(!parseEDNSOptions(dq)); + BOOST_CHECK(!parseEDNSOptions(dnsQuestion)); /* And now we add our own ECS */ - BOOST_CHECK(handleEDNSClientSubnet(dq, ednsAdded, ecsAdded)); + BOOST_CHECK(handleEDNSClientSubnet(dnsQuestion, ednsAdded, ecsAdded)); BOOST_CHECK_GT(packet.size(), query.size()); BOOST_CHECK_EQUAL(ednsAdded, true); BOOST_CHECK_EQUAL(ecsAdded, true); @@ -396,14 +413,14 @@ BOOST_AUTO_TEST_CASE(addECSWithoutEDNSAlreadyParsed) ednsAdded = false; ecsAdded = false; - + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) ids.qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &ids.qtype, &ids.qclass); BOOST_CHECK_EQUAL(ids.qname, name); BOOST_CHECK(ids.qtype == QType::A); BOOST_CHECK(ids.qclass == QClass::IN); - DNSQuestion dq2(ids, packet); + DNSQuestion dnsQuestion2(ids, packet); - BOOST_CHECK(handleEDNSClientSubnet(dq2, ednsAdded, ecsAdded)); + BOOST_CHECK(handleEDNSClientSubnet(dnsQuestion2, ednsAdded, ecsAdded)); BOOST_CHECK_GT(packet.size(), query.size()); BOOST_CHECK_LT(packet.size(), 2048U); BOOST_CHECK_EQUAL(ednsAdded, true); @@ -422,15 +439,16 @@ BOOST_AUTO_TEST_CASE(addECSWithEDNSNoECS) generateECSOption(remote, newECSOption, remote.sin4.sin_family == AF_INET ? ECSSourcePrefixV4 : ECSSourcePrefixV6); PacketBuffer query; - GenericDNSPacketWriter pw(query, name, QType::A, QClass::IN, 0); - pw.getHeader()->rd = 1; - pw.addOpt(512, 0, 0); - pw.commit(); + GenericDNSPacketWriter packetWriter(query, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->rd = 1; + packetWriter.addOpt(512, 0, 0); + packetWriter.commit(); auto packet = query; unsigned int consumed = 0; - uint16_t qtype; + uint16_t qtype = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) DNSName qname(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -447,7 +465,7 @@ BOOST_AUTO_TEST_CASE(addECSWithEDNSNoECS) ednsAdded = false; ecsAdded = false; packet = query; - + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -469,24 +487,24 @@ BOOST_AUTO_TEST_CASE(addECSWithEDNSNoECSAlreadyParsed) DNSName name("www.powerdns.com."); PacketBuffer query; - GenericDNSPacketWriter pw(query, name, QType::A, QClass::IN, 0); - pw.getHeader()->rd = 1; - pw.addOpt(512, 0, 0); - pw.commit(); + GenericDNSPacketWriter packetWriter(query, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->rd = 1; + packetWriter.addOpt(512, 0, 0); + packetWriter.commit(); auto packet = query; - + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) ids.qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &ids.qtype, &ids.qclass); BOOST_CHECK_EQUAL(ids.qname, name); BOOST_CHECK(ids.qtype == QType::A); BOOST_CHECK(ids.qclass == QClass::IN); - DNSQuestion dq(ids, packet); + DNSQuestion dnsQuestion(ids, packet); /* Parse the options before handling ECS, simulating a Lua rule asking for EDNS Options */ - BOOST_CHECK(parseEDNSOptions(dq)); + BOOST_CHECK(parseEDNSOptions(dnsQuestion)); /* And now we add our own ECS */ - BOOST_CHECK(handleEDNSClientSubnet(dq, ednsAdded, ecsAdded)); + BOOST_CHECK(handleEDNSClientSubnet(dnsQuestion, ednsAdded, ecsAdded)); BOOST_CHECK_GT(packet.size(), query.size()); BOOST_CHECK_EQUAL(ednsAdded, false); BOOST_CHECK_EQUAL(ecsAdded, true); @@ -498,13 +516,14 @@ BOOST_AUTO_TEST_CASE(addECSWithEDNSNoECSAlreadyParsed) packet.resize(2048); ednsAdded = false; ecsAdded = false; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) ids.qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &ids.qtype, &ids.qclass); BOOST_CHECK_EQUAL(ids.qname, name); BOOST_CHECK(ids.qtype == QType::A); BOOST_CHECK(ids.qclass == QClass::IN); - DNSQuestion dq2(ids, packet); + DNSQuestion dnsQuestion2(ids, packet); - BOOST_CHECK(handleEDNSClientSubnet(dq2, ednsAdded, ecsAdded)); + BOOST_CHECK(handleEDNSClientSubnet(dnsQuestion2, ednsAdded, ecsAdded)); BOOST_CHECK_GT(packet.size(), query.size()); BOOST_CHECK_LT(packet.size(), 2048U); BOOST_CHECK_EQUAL(ednsAdded, false); @@ -524,21 +543,22 @@ BOOST_AUTO_TEST_CASE(replaceECSWithSameSize) generateECSOption(remote, newECSOption, remote.sin4.sin_family == AF_INET ? ECSSourcePrefixV4 : ECSSourcePrefixV6); PacketBuffer query; - GenericDNSPacketWriter pw(query, name, QType::A, QClass::IN, 0); - pw.getHeader()->rd = 1; + GenericDNSPacketWriter packetWriter(query, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->rd = 1; EDNSSubnetOpts ecsOpts; ecsOpts.source = Netmask(origRemote, ECSSourcePrefixV4); string origECSOption = makeEDNSSubnetOptsString(ecsOpts); GenericDNSPacketWriter::optvect_t opts; opts.emplace_back(EDNSOptionCode::ECS, origECSOption); - pw.addOpt(512, 0, 0, opts); - pw.commit(); + packetWriter.addOpt(512, 0, 0, opts); + packetWriter.commit(); /* large enough packet */ auto packet = query; unsigned int consumed = 0; - uint16_t qtype; + uint16_t qtype = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) DNSName qname(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -563,34 +583,35 @@ BOOST_AUTO_TEST_CASE(replaceECSWithSameSizeAlreadyParsed) ids.qname = DNSName("www.powerdns.com."); PacketBuffer query; - GenericDNSPacketWriter pw(query, ids.qname, QType::A, QClass::IN, 0); - pw.getHeader()->rd = 1; + GenericDNSPacketWriter packetWriter(query, ids.qname, QType::A, QClass::IN, 0); + packetWriter.getHeader()->rd = 1; EDNSSubnetOpts ecsOpts; ecsOpts.source = Netmask(origRemote, ECSSourcePrefixV4); string origECSOption = makeEDNSSubnetOptsString(ecsOpts); GenericDNSPacketWriter::optvect_t opts; opts.emplace_back(EDNSOptionCode::ECS, origECSOption); - pw.addOpt(512, 0, 0, opts); - pw.commit(); + packetWriter.addOpt(512, 0, 0, opts); + packetWriter.commit(); auto packet = query; unsigned int consumed = 0; - uint16_t qtype; - uint16_t qclass; + uint16_t qtype = 0; + uint16_t qclass = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) DNSName qname(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, &qclass, &consumed); BOOST_CHECK_EQUAL(qname, ids.qname); BOOST_CHECK(qtype == QType::A); BOOST_CHECK(qclass == QClass::IN); - DNSQuestion dq(ids, packet); - dq.ecsOverride = true; + DNSQuestion dnsQuestion(ids, packet); + dnsQuestion.ecsOverride = true; /* Parse the options before handling ECS, simulating a Lua rule asking for EDNS Options */ - BOOST_CHECK(parseEDNSOptions(dq)); + BOOST_CHECK(parseEDNSOptions(dnsQuestion)); /* And now we add our own ECS */ - BOOST_CHECK(handleEDNSClientSubnet(dq, ednsAdded, ecsAdded)); + BOOST_CHECK(handleEDNSClientSubnet(dnsQuestion, ednsAdded, ecsAdded)); BOOST_CHECK_EQUAL(packet.size(), query.size()); BOOST_CHECK_EQUAL(ednsAdded, false); BOOST_CHECK_EQUAL(ecsAdded, false); @@ -609,20 +630,21 @@ BOOST_AUTO_TEST_CASE(replaceECSWithSmaller) generateECSOption(remote, newECSOption, remote.sin4.sin_family == AF_INET ? ECSSourcePrefixV4 : ECSSourcePrefixV6); PacketBuffer query; - GenericDNSPacketWriter pw(query, name, QType::A, QClass::IN, 0); - pw.getHeader()->rd = 1; + GenericDNSPacketWriter packetWriter(query, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->rd = 1; EDNSSubnetOpts ecsOpts; ecsOpts.source = Netmask(origRemote, 32); string origECSOption = makeEDNSSubnetOptsString(ecsOpts); GenericDNSPacketWriter::optvect_t opts; opts.emplace_back(EDNSOptionCode::ECS, origECSOption); - pw.addOpt(512, 0, 0, opts); - pw.commit(); + packetWriter.addOpt(512, 0, 0, opts); + packetWriter.commit(); auto packet = query; unsigned int consumed = 0; - uint16_t qtype; + uint16_t qtype = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) DNSName qname(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -646,8 +668,8 @@ BOOST_AUTO_TEST_CASE(replaceECSWithLarger) generateECSOption(remote, newECSOption, remote.sin4.sin_family == AF_INET ? ECSSourcePrefixV4 : ECSSourcePrefixV6); PacketBuffer query; - GenericDNSPacketWriter pw(query, name, QType::A, QClass::IN, 0); - pw.getHeader()->rd = 1; + GenericDNSPacketWriter packetWriter(query, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->rd = 1; EDNSSubnetOpts ecsOpts; // smaller (less specific so less bits) option static_assert(8 < ECSSourcePrefixV4, "The ECS scope should be smaller"); @@ -655,14 +677,15 @@ BOOST_AUTO_TEST_CASE(replaceECSWithLarger) string origECSOption = makeEDNSSubnetOptsString(ecsOpts); GenericDNSPacketWriter::optvect_t opts; opts.emplace_back(EDNSOptionCode::ECS, origECSOption); - pw.addOpt(512, 0, 0, opts); - pw.commit(); + packetWriter.addOpt(512, 0, 0, opts); + packetWriter.commit(); /* large enough packet */ auto packet = query; unsigned int consumed = 0; - uint16_t qtype; + uint16_t qtype = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) DNSName qname(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -680,6 +703,7 @@ BOOST_AUTO_TEST_CASE(replaceECSWithLarger) ednsAdded = false; ecsAdded = false; consumed = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -702,22 +726,23 @@ BOOST_AUTO_TEST_CASE(replaceECSFollowedByTSIG) generateECSOption(remote, newECSOption, remote.sin4.sin_family == AF_INET ? ECSSourcePrefixV4 : ECSSourcePrefixV6); PacketBuffer query; - GenericDNSPacketWriter pw(query, name, QType::A, QClass::IN, 0); - pw.getHeader()->rd = 1; + GenericDNSPacketWriter packetWriter(query, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->rd = 1; EDNSSubnetOpts ecsOpts; ecsOpts.source = Netmask(origRemote, 8); string origECSOption = makeEDNSSubnetOptsString(ecsOpts); GenericDNSPacketWriter::optvect_t opts; opts.emplace_back(EDNSOptionCode::ECS, origECSOption); - pw.addOpt(512, 0, 0, opts); - pw.startRecord(DNSName("tsigname."), QType::TSIG, 0, QClass::ANY, DNSResourceRecord::ADDITIONAL, false); - pw.commit(); + packetWriter.addOpt(512, 0, 0, opts); + packetWriter.startRecord(DNSName("tsigname."), QType::TSIG, 0, QClass::ANY, DNSResourceRecord::ADDITIONAL, false); + packetWriter.commit(); /* large enough packet */ auto packet = query; unsigned int consumed = 0; - uint16_t qtype; + uint16_t qtype = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) DNSName qname(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -735,6 +760,7 @@ BOOST_AUTO_TEST_CASE(replaceECSFollowedByTSIG) ednsAdded = false; ecsAdded = false; consumed = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -757,23 +783,24 @@ BOOST_AUTO_TEST_CASE(replaceECSAfterAN) generateECSOption(remote, newECSOption, remote.sin4.sin_family == AF_INET ? ECSSourcePrefixV4 : ECSSourcePrefixV6); PacketBuffer query; - GenericDNSPacketWriter pw(query, name, QType::A, QClass::IN, 0); - pw.getHeader()->rd = 1; - pw.startRecord(DNSName("powerdns.com."), QType::A, 0, QClass::IN, DNSResourceRecord::ANSWER, true); - pw.commit(); + GenericDNSPacketWriter packetWriter(query, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->rd = 1; + packetWriter.startRecord(DNSName("powerdns.com."), QType::A, 0, QClass::IN, DNSResourceRecord::ANSWER, true); + packetWriter.commit(); EDNSSubnetOpts ecsOpts; ecsOpts.source = Netmask(origRemote, 8); string origECSOption = makeEDNSSubnetOptsString(ecsOpts); GenericDNSPacketWriter::optvect_t opts; opts.emplace_back(EDNSOptionCode::ECS, origECSOption); - pw.addOpt(512, 0, 0, opts); - pw.commit(); + packetWriter.addOpt(512, 0, 0, opts); + packetWriter.commit(); /* large enough packet */ auto packet = query; unsigned int consumed = 0; - uint16_t qtype; + uint16_t qtype = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) DNSName qname(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -791,6 +818,7 @@ BOOST_AUTO_TEST_CASE(replaceECSAfterAN) ednsAdded = false; ecsAdded = false; consumed = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -813,23 +841,24 @@ BOOST_AUTO_TEST_CASE(replaceECSAfterAuth) generateECSOption(remote, newECSOption, remote.sin4.sin_family == AF_INET ? ECSSourcePrefixV4 : ECSSourcePrefixV6); PacketBuffer query; - GenericDNSPacketWriter pw(query, name, QType::A, QClass::IN, 0); - pw.getHeader()->rd = 1; - pw.startRecord(DNSName("powerdns.com."), QType::A, 0, QClass::IN, DNSResourceRecord::AUTHORITY, true); - pw.commit(); + GenericDNSPacketWriter packetWriter(query, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->rd = 1; + packetWriter.startRecord(DNSName("powerdns.com."), QType::A, 0, QClass::IN, DNSResourceRecord::AUTHORITY, true); + packetWriter.commit(); EDNSSubnetOpts ecsOpts; ecsOpts.source = Netmask(origRemote, 8); string origECSOption = makeEDNSSubnetOptsString(ecsOpts); GenericDNSPacketWriter::optvect_t opts; opts.emplace_back(EDNSOptionCode::ECS, origECSOption); - pw.addOpt(512, 0, 0, opts); - pw.commit(); + packetWriter.addOpt(512, 0, 0, opts); + packetWriter.commit(); /* large enough packet */ auto packet = query; unsigned int consumed = 0; - uint16_t qtype; + uint16_t qtype = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) DNSName qname(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -847,6 +876,7 @@ BOOST_AUTO_TEST_CASE(replaceECSAfterAuth) ednsAdded = false; ecsAdded = false; consumed = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -869,24 +899,25 @@ BOOST_AUTO_TEST_CASE(replaceECSBetweenTwoRecords) generateECSOption(remote, newECSOption, remote.sin4.sin_family == AF_INET ? ECSSourcePrefixV4 : ECSSourcePrefixV6); PacketBuffer query; - GenericDNSPacketWriter pw(query, name, QType::A, QClass::IN, 0); - pw.getHeader()->rd = 1; + GenericDNSPacketWriter packetWriter(query, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->rd = 1; EDNSSubnetOpts ecsOpts; ecsOpts.source = Netmask(origRemote, 8); string origECSOption = makeEDNSSubnetOptsString(ecsOpts); GenericDNSPacketWriter::optvect_t opts; opts.emplace_back(EDNSOptionCode::ECS, origECSOption); - pw.startRecord(DNSName("additional"), QType::A, 0, QClass::IN, DNSResourceRecord::ADDITIONAL, false); - pw.xfr32BitInt(0x01020304); - pw.addOpt(512, 0, 0, opts); - pw.startRecord(DNSName("tsigname."), QType::TSIG, 0, QClass::ANY, DNSResourceRecord::ADDITIONAL, false); - pw.commit(); + packetWriter.startRecord(DNSName("additional"), QType::A, 0, QClass::IN, DNSResourceRecord::ADDITIONAL, false); + packetWriter.xfr32BitInt(0x01020304); + packetWriter.addOpt(512, 0, 0, opts); + packetWriter.startRecord(DNSName("tsigname."), QType::TSIG, 0, QClass::ANY, DNSResourceRecord::ADDITIONAL, false); + packetWriter.commit(); /* large enough packet */ auto packet = query; unsigned int consumed = 0; - uint16_t qtype; + uint16_t qtype = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) DNSName qname(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -904,6 +935,7 @@ BOOST_AUTO_TEST_CASE(replaceECSBetweenTwoRecords) ednsAdded = false; ecsAdded = false; consumed = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -926,19 +958,20 @@ BOOST_AUTO_TEST_CASE(insertECSInEDNSBetweenTwoRecords) generateECSOption(remote, newECSOption, remote.sin4.sin_family == AF_INET ? ECSSourcePrefixV4 : ECSSourcePrefixV6); PacketBuffer query; - GenericDNSPacketWriter pw(query, name, QType::A, QClass::IN, 0); - pw.getHeader()->rd = 1; - pw.startRecord(DNSName("additional"), QType::A, 0, QClass::IN, DNSResourceRecord::ADDITIONAL, false); - pw.xfr32BitInt(0x01020304); - pw.addOpt(512, 0, 0); - pw.startRecord(DNSName("tsigname."), QType::TSIG, 0, QClass::ANY, DNSResourceRecord::ADDITIONAL, false); - pw.commit(); + GenericDNSPacketWriter packetWriter(query, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->rd = 1; + packetWriter.startRecord(DNSName("additional"), QType::A, 0, QClass::IN, DNSResourceRecord::ADDITIONAL, false); + packetWriter.xfr32BitInt(0x01020304); + packetWriter.addOpt(512, 0, 0); + packetWriter.startRecord(DNSName("tsigname."), QType::TSIG, 0, QClass::ANY, DNSResourceRecord::ADDITIONAL, false); + packetWriter.commit(); /* large enough packet */ auto packet = query; unsigned int consumed = 0; - uint16_t qtype; + uint16_t qtype = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) DNSName qname(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -956,6 +989,7 @@ BOOST_AUTO_TEST_CASE(insertECSInEDNSBetweenTwoRecords) ednsAdded = false; ecsAdded = false; consumed = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -978,16 +1012,17 @@ BOOST_AUTO_TEST_CASE(insertECSAfterTSIG) generateECSOption(remote, newECSOption, remote.sin4.sin_family == AF_INET ? ECSSourcePrefixV4 : ECSSourcePrefixV6); PacketBuffer query; - GenericDNSPacketWriter pw(query, name, QType::A, QClass::IN, 0); - pw.getHeader()->rd = 1; - pw.startRecord(DNSName("tsigname."), QType::TSIG, 0, QClass::ANY, DNSResourceRecord::ADDITIONAL, false); - pw.commit(); + GenericDNSPacketWriter packetWriter(query, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->rd = 1; + packetWriter.startRecord(DNSName("tsigname."), QType::TSIG, 0, QClass::ANY, DNSResourceRecord::ADDITIONAL, false); + packetWriter.commit(); /* large enough packet */ auto packet = query; unsigned int consumed = 0; - uint16_t qtype; + uint16_t qtype = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) DNSName qname(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -1006,6 +1041,7 @@ BOOST_AUTO_TEST_CASE(insertECSAfterTSIG) ednsAdded = false; ecsAdded = false; consumed = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -1022,23 +1058,24 @@ BOOST_AUTO_TEST_CASE(removeEDNSWhenFirst) DNSName name("www.powerdns.com."); PacketBuffer response; - GenericDNSPacketWriter pw(response, name, QType::A, QClass::IN, 0); - pw.getHeader()->qr = 1; - pw.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ANSWER, true); - pw.xfr32BitInt(0x01020304); - pw.addOpt(512, 0, 0); - pw.commit(); - pw.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ADDITIONAL, true); - pw.xfr32BitInt(0x01020304); - pw.commit(); + GenericDNSPacketWriter packetWriter(response, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->qr = 1; + packetWriter.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ANSWER, true); + packetWriter.xfr32BitInt(0x01020304); + packetWriter.addOpt(512, 0, 0); + packetWriter.commit(); + packetWriter.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ADDITIONAL, true); + packetWriter.xfr32BitInt(0x01020304); + packetWriter.commit(); PacketBuffer newResponse; int res = rewriteResponseWithoutEDNS(response, newResponse); BOOST_CHECK_EQUAL(res, 0); unsigned int consumed = 0; - uint16_t qtype; - DNSName qname((const char*)newResponse.data(), newResponse.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); + uint16_t qtype = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + DNSName qname(reinterpret_cast(newResponse.data()), newResponse.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); size_t const ednsOptRRSize = sizeof(struct dnsrecordheader) + 1 /* root in OPT RR */; @@ -1052,26 +1089,27 @@ BOOST_AUTO_TEST_CASE(removeEDNSWhenIntermediary) DNSName name("www.powerdns.com."); PacketBuffer response; - GenericDNSPacketWriter pw(response, name, QType::A, QClass::IN, 0); - pw.getHeader()->qr = 1; - pw.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ANSWER, true); - pw.xfr32BitInt(0x01020304); - pw.startRecord(DNSName("other.powerdns.com."), QType::A, 3600, QClass::IN, DNSResourceRecord::ADDITIONAL, true); - pw.xfr32BitInt(0x01020304); - pw.commit(); - pw.addOpt(512, 0, 0); - pw.commit(); - pw.startRecord(DNSName("yetanother.powerdns.com."), QType::A, 3600, QClass::IN, DNSResourceRecord::ADDITIONAL, true); - pw.xfr32BitInt(0x01020304); - pw.commit(); + GenericDNSPacketWriter packetWriter(response, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->qr = 1; + packetWriter.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ANSWER, true); + packetWriter.xfr32BitInt(0x01020304); + packetWriter.startRecord(DNSName("other.powerdns.com."), QType::A, 3600, QClass::IN, DNSResourceRecord::ADDITIONAL, true); + packetWriter.xfr32BitInt(0x01020304); + packetWriter.commit(); + packetWriter.addOpt(512, 0, 0); + packetWriter.commit(); + packetWriter.startRecord(DNSName("yetanother.powerdns.com."), QType::A, 3600, QClass::IN, DNSResourceRecord::ADDITIONAL, true); + packetWriter.xfr32BitInt(0x01020304); + packetWriter.commit(); PacketBuffer newResponse; int res = rewriteResponseWithoutEDNS(response, newResponse); BOOST_CHECK_EQUAL(res, 0); unsigned int consumed = 0; - uint16_t qtype; - DNSName qname((const char*)newResponse.data(), newResponse.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); + uint16_t qtype = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + DNSName qname(reinterpret_cast(newResponse.data()), newResponse.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); size_t const ednsOptRRSize = sizeof(struct dnsrecordheader) + 1 /* root in OPT RR */; @@ -1085,16 +1123,16 @@ BOOST_AUTO_TEST_CASE(removeEDNSWhenLast) DNSName name("www.powerdns.com."); PacketBuffer response; - GenericDNSPacketWriter pw(response, name, QType::A, QClass::IN, 0); - pw.getHeader()->qr = 1; - pw.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ANSWER, true); - pw.xfr32BitInt(0x01020304); - pw.commit(); - pw.startRecord(DNSName("other.powerdns.com."), QType::A, 3600, QClass::IN, DNSResourceRecord::ADDITIONAL, true); - pw.xfr32BitInt(0x01020304); - pw.commit(); - pw.addOpt(512, 0, 0); - pw.commit(); + GenericDNSPacketWriter packetWriter(response, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->qr = 1; + packetWriter.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ANSWER, true); + packetWriter.xfr32BitInt(0x01020304); + packetWriter.commit(); + packetWriter.startRecord(DNSName("other.powerdns.com."), QType::A, 3600, QClass::IN, DNSResourceRecord::ADDITIONAL, true); + packetWriter.xfr32BitInt(0x01020304); + packetWriter.commit(); + packetWriter.addOpt(512, 0, 0); + packetWriter.commit(); PacketBuffer newResponse; int res = rewriteResponseWithoutEDNS(response, newResponse); @@ -1102,8 +1140,9 @@ BOOST_AUTO_TEST_CASE(removeEDNSWhenLast) BOOST_CHECK_EQUAL(res, 0); unsigned int consumed = 0; - uint16_t qtype; - DNSName qname((const char*)newResponse.data(), newResponse.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); + uint16_t qtype = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + DNSName qname(reinterpret_cast(newResponse.data()), newResponse.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); size_t const ednsOptRRSize = sizeof(struct dnsrecordheader) + 1 /* root in OPT RR */; @@ -1118,24 +1157,24 @@ BOOST_AUTO_TEST_CASE(removeECSWhenOnlyOption) ComboAddress origRemote("127.0.0.1"); PacketBuffer response; - GenericDNSPacketWriter pw(response, name, QType::A, QClass::IN, 0); - pw.getHeader()->qr = 1; - pw.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ANSWER, true); - pw.xfr32BitInt(0x01020304); + GenericDNSPacketWriter packetWriter(response, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->qr = 1; + packetWriter.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ANSWER, true); + packetWriter.xfr32BitInt(0x01020304); - pw.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ADDITIONAL, true); - pw.xfr32BitInt(0x01020304); - pw.commit(); + packetWriter.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ADDITIONAL, true); + packetWriter.xfr32BitInt(0x01020304); + packetWriter.commit(); EDNSSubnetOpts ecsOpts; ecsOpts.source = Netmask(origRemote, ECSSourcePrefixV4); string origECSOptionStr = makeEDNSSubnetOptsString(ecsOpts); GenericDNSPacketWriter::optvect_t opts; opts.emplace_back(EDNSOptionCode::ECS, origECSOptionStr); - pw.addOpt(512, 0, 0, opts); - pw.commit(); + packetWriter.addOpt(512, 0, 0, opts); + packetWriter.commit(); - uint16_t optStart; + uint16_t optStart = 0; size_t optLen = 0; bool last = false; @@ -1146,14 +1185,16 @@ BOOST_AUTO_TEST_CASE(removeECSWhenOnlyOption) size_t responseLen = response.size(); size_t existingOptLen = optLen; BOOST_CHECK(existingOptLen < responseLen); - res = removeEDNSOptionFromOPT(reinterpret_cast(response.data()) + optStart, &optLen, EDNSOptionCode::ECS); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + res = removeEDNSOptionFromOPT(reinterpret_cast(&response.at(optStart)), &optLen, EDNSOptionCode::ECS); BOOST_CHECK_EQUAL(res, 0); BOOST_CHECK_EQUAL(optLen, existingOptLen - (origECSOptionStr.size() + 4)); responseLen -= (existingOptLen - optLen); unsigned int consumed = 0; - uint16_t qtype; - DNSName qname((const char*)response.data(), responseLen, sizeof(dnsheader), false, &qtype, nullptr, &consumed); + uint16_t qtype = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + DNSName qname(reinterpret_cast(response.data()), responseLen, sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -1166,14 +1207,14 @@ BOOST_AUTO_TEST_CASE(removeECSWhenFirstOption) ComboAddress origRemote("127.0.0.1"); PacketBuffer response; - GenericDNSPacketWriter pw(response, name, QType::A, QClass::IN, 0); - pw.getHeader()->qr = 1; - pw.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ANSWER, true); - pw.xfr32BitInt(0x01020304); + GenericDNSPacketWriter packetWriter(response, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->qr = 1; + packetWriter.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ANSWER, true); + packetWriter.xfr32BitInt(0x01020304); - pw.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ADDITIONAL, true); - pw.xfr32BitInt(0x01020304); - pw.commit(); + packetWriter.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ADDITIONAL, true); + packetWriter.xfr32BitInt(0x01020304); + packetWriter.commit(); EDNSSubnetOpts ecsOpts; ecsOpts.source = Netmask(origRemote, ECSSourcePrefixV6); @@ -1183,10 +1224,10 @@ BOOST_AUTO_TEST_CASE(removeECSWhenFirstOption) GenericDNSPacketWriter::optvect_t opts; opts.emplace_back(EDNSOptionCode::ECS, origECSOptionStr); opts.emplace_back(EDNSOptionCode::COOKIE, cookiesOptionStr); - pw.addOpt(512, 0, 0, opts); - pw.commit(); + packetWriter.addOpt(512, 0, 0, opts); + packetWriter.commit(); - uint16_t optStart; + uint16_t optStart = 0; size_t optLen = 0; bool last = false; @@ -1197,14 +1238,16 @@ BOOST_AUTO_TEST_CASE(removeECSWhenFirstOption) size_t responseLen = response.size(); size_t existingOptLen = optLen; BOOST_CHECK(existingOptLen < responseLen); - res = removeEDNSOptionFromOPT(reinterpret_cast(response.data()) + optStart, &optLen, EDNSOptionCode::ECS); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + res = removeEDNSOptionFromOPT(reinterpret_cast(&response.at(optStart)), &optLen, EDNSOptionCode::ECS); BOOST_CHECK_EQUAL(res, 0); BOOST_CHECK_EQUAL(optLen, existingOptLen - (origECSOptionStr.size() + 4)); responseLen -= (existingOptLen - optLen); unsigned int consumed = 0; - uint16_t qtype; - DNSName qname((const char*)response.data(), responseLen, sizeof(dnsheader), false, &qtype, nullptr, &consumed); + uint16_t qtype = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + DNSName qname(reinterpret_cast(response.data()), responseLen, sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -1217,14 +1260,14 @@ BOOST_AUTO_TEST_CASE(removeECSWhenIntermediaryOption) ComboAddress origRemote("127.0.0.1"); PacketBuffer response; - GenericDNSPacketWriter pw(response, name, QType::A, QClass::IN, 0); - pw.getHeader()->qr = 1; - pw.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ANSWER, true); - pw.xfr32BitInt(0x01020304); + GenericDNSPacketWriter packetWriter(response, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->qr = 1; + packetWriter.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ANSWER, true); + packetWriter.xfr32BitInt(0x01020304); - pw.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ADDITIONAL, true); - pw.xfr32BitInt(0x01020304); - pw.commit(); + packetWriter.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ADDITIONAL, true); + packetWriter.xfr32BitInt(0x01020304); + packetWriter.commit(); EDNSSubnetOpts ecsOpts; ecsOpts.source = Netmask(origRemote, ECSSourcePrefixV4); @@ -1238,10 +1281,10 @@ BOOST_AUTO_TEST_CASE(removeECSWhenIntermediaryOption) opts.emplace_back(EDNSOptionCode::COOKIE, cookiesOptionStr1); opts.emplace_back(EDNSOptionCode::ECS, origECSOptionStr); opts.emplace_back(EDNSOptionCode::COOKIE, cookiesOptionStr2); - pw.addOpt(512, 0, 0, opts); - pw.commit(); + packetWriter.addOpt(512, 0, 0, opts); + packetWriter.commit(); - uint16_t optStart; + uint16_t optStart = 0; size_t optLen = 0; bool last = false; @@ -1252,14 +1295,16 @@ BOOST_AUTO_TEST_CASE(removeECSWhenIntermediaryOption) size_t responseLen = response.size(); size_t existingOptLen = optLen; BOOST_CHECK(existingOptLen < responseLen); - res = removeEDNSOptionFromOPT(reinterpret_cast(response.data()) + optStart, &optLen, EDNSOptionCode::ECS); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + res = removeEDNSOptionFromOPT(reinterpret_cast(&response.at(optStart)), &optLen, EDNSOptionCode::ECS); BOOST_CHECK_EQUAL(res, 0); BOOST_CHECK_EQUAL(optLen, existingOptLen - (origECSOptionStr.size() + 4)); responseLen -= (existingOptLen - optLen); unsigned int consumed = 0; - uint16_t qtype; - DNSName qname((const char*)response.data(), responseLen, sizeof(dnsheader), false, &qtype, nullptr, &consumed); + uint16_t qtype = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + DNSName qname(reinterpret_cast(response.data()), responseLen, sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -1272,14 +1317,14 @@ BOOST_AUTO_TEST_CASE(removeECSWhenLastOption) ComboAddress origRemote("127.0.0.1"); PacketBuffer response; - GenericDNSPacketWriter pw(response, name, QType::A, QClass::IN, 0); - pw.getHeader()->qr = 1; - pw.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ANSWER, true); - pw.xfr32BitInt(0x01020304); + GenericDNSPacketWriter packetWriter(response, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->qr = 1; + packetWriter.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ANSWER, true); + packetWriter.xfr32BitInt(0x01020304); - pw.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ADDITIONAL, true); - pw.xfr32BitInt(0x01020304); - pw.commit(); + packetWriter.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ADDITIONAL, true); + packetWriter.xfr32BitInt(0x01020304); + packetWriter.commit(); EDNSCookiesOpt cookiesOpt("deadbeefdeadbeef"); string cookiesOptionStr = cookiesOpt.makeOptString(); @@ -1289,10 +1334,10 @@ BOOST_AUTO_TEST_CASE(removeECSWhenLastOption) GenericDNSPacketWriter::optvect_t opts; opts.emplace_back(EDNSOptionCode::COOKIE, cookiesOptionStr); opts.emplace_back(EDNSOptionCode::ECS, origECSOptionStr); - pw.addOpt(512, 0, 0, opts); - pw.commit(); + packetWriter.addOpt(512, 0, 0, opts); + packetWriter.commit(); - uint16_t optStart; + uint16_t optStart = 0; size_t optLen = 0; bool last = false; @@ -1303,14 +1348,16 @@ BOOST_AUTO_TEST_CASE(removeECSWhenLastOption) size_t responseLen = response.size(); size_t existingOptLen = optLen; BOOST_CHECK(existingOptLen < responseLen); - res = removeEDNSOptionFromOPT(reinterpret_cast(response.data()) + optStart, &optLen, EDNSOptionCode::ECS); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + res = removeEDNSOptionFromOPT(reinterpret_cast(&response.at(optStart)), &optLen, EDNSOptionCode::ECS); BOOST_CHECK_EQUAL(res, 0); BOOST_CHECK_EQUAL(optLen, existingOptLen - (origECSOptionStr.size() + 4)); responseLen -= (existingOptLen - optLen); unsigned int consumed = 0; - uint16_t qtype; - DNSName qname((const char*)response.data(), responseLen, sizeof(dnsheader), false, &qtype, nullptr, &consumed); + uint16_t qtype = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + DNSName qname(reinterpret_cast(response.data()), responseLen, sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -1323,22 +1370,22 @@ BOOST_AUTO_TEST_CASE(rewritingWithoutECSWhenOnlyOption) ComboAddress origRemote("127.0.0.1"); PacketBuffer response; - GenericDNSPacketWriter pw(response, name, QType::A, QClass::IN, 0); - pw.getHeader()->qr = 1; - pw.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ANSWER, true); - pw.xfr32BitInt(0x01020304); + GenericDNSPacketWriter packetWriter(response, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->qr = 1; + packetWriter.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ANSWER, true); + packetWriter.xfr32BitInt(0x01020304); EDNSSubnetOpts ecsOpts; ecsOpts.source = Netmask(origRemote, ECSSourcePrefixV4); string origECSOptionStr = makeEDNSSubnetOptsString(ecsOpts); GenericDNSPacketWriter::optvect_t opts; opts.emplace_back(EDNSOptionCode::ECS, origECSOptionStr); - pw.addOpt(512, 0, 0, opts); - pw.commit(); + packetWriter.addOpt(512, 0, 0, opts); + packetWriter.commit(); - pw.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ADDITIONAL, true); - pw.xfr32BitInt(0x01020304); - pw.commit(); + packetWriter.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ADDITIONAL, true); + packetWriter.xfr32BitInt(0x01020304); + packetWriter.commit(); PacketBuffer newResponse; int res = rewriteResponseWithoutEDNSOption(response, EDNSOptionCode::ECS, newResponse); @@ -1347,8 +1394,9 @@ BOOST_AUTO_TEST_CASE(rewritingWithoutECSWhenOnlyOption) BOOST_CHECK_EQUAL(newResponse.size(), response.size() - (origECSOptionStr.size() + 4)); unsigned int consumed = 0; - uint16_t qtype; - DNSName qname((const char*)newResponse.data(), newResponse.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); + uint16_t qtype = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + DNSName qname(reinterpret_cast(newResponse.data()), newResponse.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -1361,10 +1409,10 @@ BOOST_AUTO_TEST_CASE(rewritingWithoutECSWhenFirstOption) ComboAddress origRemote("127.0.0.1"); PacketBuffer response; - GenericDNSPacketWriter pw(response, name, QType::A, QClass::IN, 0); - pw.getHeader()->qr = 1; - pw.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ANSWER, true); - pw.xfr32BitInt(0x01020304); + GenericDNSPacketWriter packetWriter(response, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->qr = 1; + packetWriter.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ANSWER, true); + packetWriter.xfr32BitInt(0x01020304); EDNSSubnetOpts ecsOpts; ecsOpts.source = Netmask(origRemote, ECSSourcePrefixV4); @@ -1374,12 +1422,12 @@ BOOST_AUTO_TEST_CASE(rewritingWithoutECSWhenFirstOption) GenericDNSPacketWriter::optvect_t opts; opts.emplace_back(EDNSOptionCode::ECS, origECSOptionStr); opts.emplace_back(EDNSOptionCode::COOKIE, cookiesOptionStr); - pw.addOpt(512, 0, 0, opts); - pw.commit(); + packetWriter.addOpt(512, 0, 0, opts); + packetWriter.commit(); - pw.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ADDITIONAL, true); - pw.xfr32BitInt(0x01020304); - pw.commit(); + packetWriter.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ADDITIONAL, true); + packetWriter.xfr32BitInt(0x01020304); + packetWriter.commit(); PacketBuffer newResponse; int res = rewriteResponseWithoutEDNSOption(response, EDNSOptionCode::ECS, newResponse); @@ -1388,8 +1436,9 @@ BOOST_AUTO_TEST_CASE(rewritingWithoutECSWhenFirstOption) BOOST_CHECK_EQUAL(newResponse.size(), response.size() - (origECSOptionStr.size() + 4)); unsigned int consumed = 0; - uint16_t qtype; - DNSName qname((const char*)newResponse.data(), newResponse.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); + uint16_t qtype = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + DNSName qname(reinterpret_cast(newResponse.data()), newResponse.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -1402,10 +1451,10 @@ BOOST_AUTO_TEST_CASE(rewritingWithoutECSWhenIntermediaryOption) ComboAddress origRemote("127.0.0.1"); PacketBuffer response; - GenericDNSPacketWriter pw(response, name, QType::A, QClass::IN, 0); - pw.getHeader()->qr = 1; - pw.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ANSWER, true); - pw.xfr32BitInt(0x01020304); + GenericDNSPacketWriter packetWriter(response, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->qr = 1; + packetWriter.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ANSWER, true); + packetWriter.xfr32BitInt(0x01020304); EDNSSubnetOpts ecsOpts; ecsOpts.source = Netmask(origRemote, ECSSourcePrefixV4); @@ -1417,12 +1466,12 @@ BOOST_AUTO_TEST_CASE(rewritingWithoutECSWhenIntermediaryOption) opts.emplace_back(EDNSOptionCode::COOKIE, cookiesOptionStr1); opts.emplace_back(EDNSOptionCode::ECS, origECSOptionStr); opts.emplace_back(EDNSOptionCode::COOKIE, cookiesOptionStr2); - pw.addOpt(512, 0, 0, opts); - pw.commit(); + packetWriter.addOpt(512, 0, 0, opts); + packetWriter.commit(); - pw.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ADDITIONAL, true); - pw.xfr32BitInt(0x01020304); - pw.commit(); + packetWriter.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ADDITIONAL, true); + packetWriter.xfr32BitInt(0x01020304); + packetWriter.commit(); PacketBuffer newResponse; int res = rewriteResponseWithoutEDNSOption(response, EDNSOptionCode::ECS, newResponse); @@ -1431,8 +1480,9 @@ BOOST_AUTO_TEST_CASE(rewritingWithoutECSWhenIntermediaryOption) BOOST_CHECK_EQUAL(newResponse.size(), response.size() - (origECSOptionStr.size() + 4)); unsigned int consumed = 0; - uint16_t qtype; - DNSName qname((const char*)newResponse.data(), newResponse.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); + uint16_t qtype = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + DNSName qname(reinterpret_cast(newResponse.data()), newResponse.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -1445,10 +1495,10 @@ BOOST_AUTO_TEST_CASE(rewritingWithoutECSWhenLastOption) ComboAddress origRemote("127.0.0.1"); PacketBuffer response; - GenericDNSPacketWriter pw(response, name, QType::A, QClass::IN, 0); - pw.getHeader()->qr = 1; - pw.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ANSWER, true); - pw.xfr32BitInt(0x01020304); + GenericDNSPacketWriter packetWriter(response, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->qr = 1; + packetWriter.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ANSWER, true); + packetWriter.xfr32BitInt(0x01020304); EDNSSubnetOpts ecsOpts; ecsOpts.source = Netmask(origRemote, ECSSourcePrefixV4); @@ -1458,12 +1508,12 @@ BOOST_AUTO_TEST_CASE(rewritingWithoutECSWhenLastOption) GenericDNSPacketWriter::optvect_t opts; opts.emplace_back(EDNSOptionCode::COOKIE, cookiesOptionStr); opts.emplace_back(EDNSOptionCode::ECS, origECSOptionStr); - pw.addOpt(512, 0, 0, opts); - pw.commit(); + packetWriter.addOpt(512, 0, 0, opts); + packetWriter.commit(); - pw.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ADDITIONAL, true); - pw.xfr32BitInt(0x01020304); - pw.commit(); + packetWriter.startRecord(name, QType::A, 3600, QClass::IN, DNSResourceRecord::ADDITIONAL, true); + packetWriter.xfr32BitInt(0x01020304); + packetWriter.commit(); PacketBuffer newResponse; int res = rewriteResponseWithoutEDNSOption(response, EDNSOptionCode::ECS, newResponse); @@ -1472,8 +1522,9 @@ BOOST_AUTO_TEST_CASE(rewritingWithoutECSWhenLastOption) BOOST_CHECK_EQUAL(newResponse.size(), response.size() - (origECSOptionStr.size() + 4)); unsigned int consumed = 0; - uint16_t qtype; - DNSName qname((const char*)newResponse.data(), newResponse.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); + uint16_t qtype = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + DNSName qname(reinterpret_cast(newResponse.data()), newResponse.size(), sizeof(dnsheader), false, &qtype, nullptr, &consumed); BOOST_CHECK_EQUAL(qname, name); BOOST_CHECK(qtype == QType::A); @@ -1486,11 +1537,11 @@ static DNSQuestion turnIntoResponse(InternalQueryState& ids, PacketBuffer& query query.resize(4096); } - auto dq = DNSQuestion(ids, query); + auto dnsQuestion = DNSQuestion(ids, query); - BOOST_CHECK(addEDNSToQueryTurnedResponse(dq)); + BOOST_CHECK(addEDNSToQueryTurnedResponse(dnsQuestion)); - return dq; + return dnsQuestion; } static int getZ(const DNSName& qname, const uint16_t qtype, const uint16_t qclass, PacketBuffer& query) @@ -1504,16 +1555,15 @@ static int getZ(const DNSName& qname, const uint16_t qtype, const uint16_t qclas ids.origRemote = ComboAddress("127.0.0.1"); ids.queryRealTime.start(); - auto dq = DNSQuestion(ids, query); + auto dnsQuestion = DNSQuestion(ids, query); - return getEDNSZ(dq); + return getEDNSZ(dnsQuestion); } BOOST_AUTO_TEST_CASE(test_getEDNSZ) { - - uint16_t z; - uint16_t udpPayloadSize; + uint16_t zValue = 0; + uint16_t udpPayloadSize = 0; DNSName qname("www.powerdns.com."); uint16_t qtype = QType::A; uint16_t qclass = QClass::IN; @@ -1529,78 +1579,84 @@ BOOST_AUTO_TEST_CASE(test_getEDNSZ) { /* no EDNS */ PacketBuffer query; - GenericDNSPacketWriter pw(query, qname, qtype, qclass, 0); - pw.commit(); + GenericDNSPacketWriter packetWriter(query, qname, qtype, qclass, 0); + packetWriter.commit(); BOOST_CHECK_EQUAL(getZ(qname, qtype, qclass, query), 0); - BOOST_CHECK_EQUAL(getEDNSUDPPayloadSizeAndZ(reinterpret_cast(query.data()), query.size(), &udpPayloadSize, &z), false); - BOOST_CHECK_EQUAL(z, 0); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + BOOST_CHECK_EQUAL(getEDNSUDPPayloadSizeAndZ(reinterpret_cast(query.data()), query.size(), &udpPayloadSize, &zValue), false); + BOOST_CHECK_EQUAL(zValue, 0); BOOST_CHECK_EQUAL(udpPayloadSize, 0); } { /* truncated EDNS */ PacketBuffer query; - GenericDNSPacketWriter pw(query, qname, qtype, qclass, 0); - pw.addOpt(512, 0, EDNS_HEADER_FLAG_DO); - pw.commit(); + GenericDNSPacketWriter packetWriter(query, qname, qtype, qclass, 0); + packetWriter.addOpt(512, 0, EDNS_HEADER_FLAG_DO); + packetWriter.commit(); query.resize(query.size() - (/* RDLEN */ sizeof(uint16_t) + /* last byte of TTL / Z */ 1)); BOOST_CHECK_EQUAL(getZ(qname, qtype, qclass, query), 0); - BOOST_CHECK_EQUAL(getEDNSUDPPayloadSizeAndZ(reinterpret_cast(query.data()), query.size(), &udpPayloadSize, &z), false); - BOOST_CHECK_EQUAL(z, 0); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + BOOST_CHECK_EQUAL(getEDNSUDPPayloadSizeAndZ(reinterpret_cast(query.data()), query.size(), &udpPayloadSize, &zValue), false); + BOOST_CHECK_EQUAL(zValue, 0); BOOST_CHECK_EQUAL(udpPayloadSize, 0); } { /* valid EDNS, no options, DO not set */ PacketBuffer query; - GenericDNSPacketWriter pw(query, qname, qtype, qclass, 0); - pw.addOpt(512, 0, 0); - pw.commit(); + GenericDNSPacketWriter packetWriter(query, qname, qtype, qclass, 0); + packetWriter.addOpt(512, 0, 0); + packetWriter.commit(); BOOST_CHECK_EQUAL(getZ(qname, qtype, qclass, query), 0); - BOOST_CHECK_EQUAL(getEDNSUDPPayloadSizeAndZ(reinterpret_cast(query.data()), query.size(), &udpPayloadSize, &z), true); - BOOST_CHECK_EQUAL(z, 0); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + BOOST_CHECK_EQUAL(getEDNSUDPPayloadSizeAndZ(reinterpret_cast(query.data()), query.size(), &udpPayloadSize, &zValue), true); + BOOST_CHECK_EQUAL(zValue, 0); BOOST_CHECK_EQUAL(udpPayloadSize, 512); } { /* valid EDNS, no options, DO set */ PacketBuffer query; - GenericDNSPacketWriter pw(query, qname, qtype, qclass, 0); - pw.addOpt(512, 0, EDNS_HEADER_FLAG_DO); - pw.commit(); + GenericDNSPacketWriter packetWriter(query, qname, qtype, qclass, 0); + packetWriter.addOpt(512, 0, EDNS_HEADER_FLAG_DO); + packetWriter.commit(); BOOST_CHECK_EQUAL(getZ(qname, qtype, qclass, query), EDNS_HEADER_FLAG_DO); - BOOST_CHECK_EQUAL(getEDNSUDPPayloadSizeAndZ(reinterpret_cast(query.data()), query.size(), &udpPayloadSize, &z), true); - BOOST_CHECK_EQUAL(z, EDNS_HEADER_FLAG_DO); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + BOOST_CHECK_EQUAL(getEDNSUDPPayloadSizeAndZ(reinterpret_cast(query.data()), query.size(), &udpPayloadSize, &zValue), true); + BOOST_CHECK_EQUAL(zValue, EDNS_HEADER_FLAG_DO); BOOST_CHECK_EQUAL(udpPayloadSize, 512); } { /* valid EDNS, options, DO not set */ PacketBuffer query; - GenericDNSPacketWriter pw(query, qname, qtype, qclass, 0); - pw.addOpt(512, 0, 0, opts); - pw.commit(); + GenericDNSPacketWriter packetWriter(query, qname, qtype, qclass, 0); + packetWriter.addOpt(512, 0, 0, opts); + packetWriter.commit(); BOOST_CHECK_EQUAL(getZ(qname, qtype, qclass, query), 0); - BOOST_CHECK_EQUAL(getEDNSUDPPayloadSizeAndZ(reinterpret_cast(query.data()), query.size(), &udpPayloadSize, &z), true); - BOOST_CHECK_EQUAL(z, 0); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + BOOST_CHECK_EQUAL(getEDNSUDPPayloadSizeAndZ(reinterpret_cast(query.data()), query.size(), &udpPayloadSize, &zValue), true); + BOOST_CHECK_EQUAL(zValue, 0); BOOST_CHECK_EQUAL(udpPayloadSize, 512); } { /* valid EDNS, options, DO set */ PacketBuffer query; - GenericDNSPacketWriter pw(query, qname, qtype, qclass, 0); - pw.addOpt(512, 0, EDNS_HEADER_FLAG_DO, opts); - pw.commit(); + GenericDNSPacketWriter packetWriter(query, qname, qtype, qclass, 0); + packetWriter.addOpt(512, 0, EDNS_HEADER_FLAG_DO, opts); + packetWriter.commit(); BOOST_CHECK_EQUAL(getZ(qname, qtype, qclass, query), EDNS_HEADER_FLAG_DO); - BOOST_CHECK_EQUAL(getEDNSUDPPayloadSizeAndZ(reinterpret_cast(query.data()), query.size(), &udpPayloadSize, &z), true); - BOOST_CHECK_EQUAL(z, EDNS_HEADER_FLAG_DO); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + BOOST_CHECK_EQUAL(getEDNSUDPPayloadSizeAndZ(reinterpret_cast(query.data()), query.size(), &udpPayloadSize, &zValue), true); + BOOST_CHECK_EQUAL(zValue, EDNS_HEADER_FLAG_DO); BOOST_CHECK_EQUAL(udpPayloadSize, 512); } } @@ -1614,8 +1670,8 @@ BOOST_AUTO_TEST_CASE(test_addEDNSToQueryTurnedResponse) ids.origDest = ComboAddress("127.0.0.1"); ids.origRemote = ComboAddress("127.0.0.1"); ids.queryRealTime.start(); - uint16_t z; - uint16_t udpPayloadSize; + uint16_t zValue = 0; + uint16_t udpPayloadSize = 0; EDNSSubnetOpts ecsOpts; ecsOpts.source = Netmask(ComboAddress("127.0.0.1"), ECSSourcePrefixV4); string origECSOptionStr = makeEDNSSubnetOptsString(ecsOpts); @@ -1628,86 +1684,92 @@ BOOST_AUTO_TEST_CASE(test_addEDNSToQueryTurnedResponse) { /* no EDNS */ PacketBuffer query; - GenericDNSPacketWriter pw(query, ids.qname, ids.qtype, ids.qclass, 0); - pw.getHeader()->qr = 1; - pw.getHeader()->rcode = RCode::NXDomain; - pw.commit(); - - auto dq = turnIntoResponse(ids, query); - BOOST_CHECK_EQUAL(getEDNSZ(dq), 0); - BOOST_CHECK_EQUAL(getEDNSUDPPayloadSizeAndZ(reinterpret_cast(dq.getData().data()), dq.getData().size(), &udpPayloadSize, &z), false); - BOOST_CHECK_EQUAL(z, 0); + GenericDNSPacketWriter packetWriter(query, ids.qname, ids.qtype, ids.qclass, 0); + packetWriter.getHeader()->qr = 1; + packetWriter.getHeader()->rcode = RCode::NXDomain; + packetWriter.commit(); + + auto dnsQuestion = turnIntoResponse(ids, query); + BOOST_CHECK_EQUAL(getEDNSZ(dnsQuestion), 0); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + BOOST_CHECK_EQUAL(getEDNSUDPPayloadSizeAndZ(reinterpret_cast(dnsQuestion.getData().data()), dnsQuestion.getData().size(), &udpPayloadSize, &zValue), false); + BOOST_CHECK_EQUAL(zValue, 0); BOOST_CHECK_EQUAL(udpPayloadSize, 0); } { /* truncated EDNS */ PacketBuffer query; - GenericDNSPacketWriter pw(query, ids.qname, ids.qtype, ids.qclass, 0); - pw.addOpt(512, 0, EDNS_HEADER_FLAG_DO); - pw.commit(); + GenericDNSPacketWriter packetWriter(query, ids.qname, ids.qtype, ids.qclass, 0); + packetWriter.addOpt(512, 0, EDNS_HEADER_FLAG_DO); + packetWriter.commit(); query.resize(query.size() - (/* RDLEN */ sizeof(uint16_t) + /* last byte of TTL / Z */ 1)); - auto dq = turnIntoResponse(ids, query, false); - BOOST_CHECK_EQUAL(getEDNSZ(dq), 0); - BOOST_CHECK_EQUAL(getEDNSUDPPayloadSizeAndZ(reinterpret_cast(dq.getData().data()), dq.getData().size(), &udpPayloadSize, &z), false); - BOOST_CHECK_EQUAL(z, 0); + auto dnsQuestion = turnIntoResponse(ids, query, false); + BOOST_CHECK_EQUAL(getEDNSZ(dnsQuestion), 0); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + BOOST_CHECK_EQUAL(getEDNSUDPPayloadSizeAndZ(reinterpret_cast(dnsQuestion.getData().data()), dnsQuestion.getData().size(), &udpPayloadSize, &zValue), false); + BOOST_CHECK_EQUAL(zValue, 0); BOOST_CHECK_EQUAL(udpPayloadSize, 0); } { /* valid EDNS, no options, DO not set */ PacketBuffer query; - GenericDNSPacketWriter pw(query, ids.qname, ids.qtype, ids.qclass, 0); - pw.addOpt(512, 0, 0); - pw.commit(); - - auto dq = turnIntoResponse(ids, query); - BOOST_CHECK_EQUAL(getEDNSZ(dq), 0); - BOOST_CHECK_EQUAL(getEDNSUDPPayloadSizeAndZ(reinterpret_cast(dq.getData().data()), dq.getData().size(), &udpPayloadSize, &z), true); - BOOST_CHECK_EQUAL(z, 0); + GenericDNSPacketWriter packetWriter(query, ids.qname, ids.qtype, ids.qclass, 0); + packetWriter.addOpt(512, 0, 0); + packetWriter.commit(); + + auto dnsQuestion = turnIntoResponse(ids, query); + BOOST_CHECK_EQUAL(getEDNSZ(dnsQuestion), 0); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + BOOST_CHECK_EQUAL(getEDNSUDPPayloadSizeAndZ(reinterpret_cast(dnsQuestion.getData().data()), dnsQuestion.getData().size(), &udpPayloadSize, &zValue), true); + BOOST_CHECK_EQUAL(zValue, 0); BOOST_CHECK_EQUAL(udpPayloadSize, g_PayloadSizeSelfGenAnswers); } { /* valid EDNS, no options, DO set */ PacketBuffer query; - GenericDNSPacketWriter pw(query, ids.qname, ids.qtype, ids.qclass, 0); - pw.addOpt(512, 0, EDNS_HEADER_FLAG_DO); - pw.commit(); - - auto dq = turnIntoResponse(ids, query); - BOOST_CHECK_EQUAL(getEDNSZ(dq), EDNS_HEADER_FLAG_DO); - BOOST_CHECK_EQUAL(getEDNSUDPPayloadSizeAndZ(reinterpret_cast(dq.getData().data()), dq.getData().size(), &udpPayloadSize, &z), true); - BOOST_CHECK_EQUAL(z, EDNS_HEADER_FLAG_DO); + GenericDNSPacketWriter packetWriter(query, ids.qname, ids.qtype, ids.qclass, 0); + packetWriter.addOpt(512, 0, EDNS_HEADER_FLAG_DO); + packetWriter.commit(); + + auto dnsQuestion = turnIntoResponse(ids, query); + BOOST_CHECK_EQUAL(getEDNSZ(dnsQuestion), EDNS_HEADER_FLAG_DO); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + BOOST_CHECK_EQUAL(getEDNSUDPPayloadSizeAndZ(reinterpret_cast(dnsQuestion.getData().data()), dnsQuestion.getData().size(), &udpPayloadSize, &zValue), true); + BOOST_CHECK_EQUAL(zValue, EDNS_HEADER_FLAG_DO); BOOST_CHECK_EQUAL(udpPayloadSize, g_PayloadSizeSelfGenAnswers); } { /* valid EDNS, options, DO not set */ PacketBuffer query; - GenericDNSPacketWriter pw(query, ids.qname, ids.qtype, ids.qclass, 0); - pw.addOpt(512, 0, 0, opts); - pw.commit(); - - auto dq = turnIntoResponse(ids, query); - BOOST_CHECK_EQUAL(getEDNSZ(dq), 0); - BOOST_CHECK_EQUAL(getEDNSUDPPayloadSizeAndZ(reinterpret_cast(dq.getData().data()), dq.getData().size(), &udpPayloadSize, &z), true); - BOOST_CHECK_EQUAL(z, 0); + GenericDNSPacketWriter packetWriter(query, ids.qname, ids.qtype, ids.qclass, 0); + packetWriter.addOpt(512, 0, 0, opts); + packetWriter.commit(); + + auto dnsQuestion = turnIntoResponse(ids, query); + BOOST_CHECK_EQUAL(getEDNSZ(dnsQuestion), 0); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + BOOST_CHECK_EQUAL(getEDNSUDPPayloadSizeAndZ(reinterpret_cast(dnsQuestion.getData().data()), dnsQuestion.getData().size(), &udpPayloadSize, &zValue), true); + BOOST_CHECK_EQUAL(zValue, 0); BOOST_CHECK_EQUAL(udpPayloadSize, g_PayloadSizeSelfGenAnswers); } { /* valid EDNS, options, DO set */ PacketBuffer query; - GenericDNSPacketWriter pw(query, ids.qname, ids.qtype, ids.qclass, 0); - pw.addOpt(512, 0, EDNS_HEADER_FLAG_DO, opts); - pw.commit(); - - auto dq = turnIntoResponse(ids, query); - BOOST_CHECK_EQUAL(getEDNSZ(dq), EDNS_HEADER_FLAG_DO); - BOOST_CHECK_EQUAL(getEDNSUDPPayloadSizeAndZ(reinterpret_cast(dq.getData().data()), dq.getData().size(), &udpPayloadSize, &z), true); - BOOST_CHECK_EQUAL(z, EDNS_HEADER_FLAG_DO); + GenericDNSPacketWriter packetWriter(query, ids.qname, ids.qtype, ids.qclass, 0); + packetWriter.addOpt(512, 0, EDNS_HEADER_FLAG_DO, opts); + packetWriter.commit(); + + auto dnsQuestion = turnIntoResponse(ids, query); + BOOST_CHECK_EQUAL(getEDNSZ(dnsQuestion), EDNS_HEADER_FLAG_DO); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + BOOST_CHECK_EQUAL(getEDNSUDPPayloadSizeAndZ(reinterpret_cast(dnsQuestion.getData().data()), dnsQuestion.getData().size(), &udpPayloadSize, &zValue), true); + BOOST_CHECK_EQUAL(zValue, EDNS_HEADER_FLAG_DO); BOOST_CHECK_EQUAL(udpPayloadSize, g_PayloadSizeSelfGenAnswers); } } @@ -1722,20 +1784,19 @@ BOOST_AUTO_TEST_CASE(test_getEDNSOptionsStart) const string ecsOptionStr = makeEDNSSubnetOptsString(ecsOpts); GenericDNSPacketWriter::optvect_t opts; opts.emplace_back(EDNSOptionCode::ECS, ecsOptionStr); - const ComboAddress lc("127.0.0.1"); const ComboAddress rem("127.0.0.1"); - uint16_t optRDPosition; - size_t remaining; + uint16_t optRDPosition = 0; + size_t remaining = 0; const size_t optRDExpectedOffset = sizeof(dnsheader) + qname.wirelength() + DNS_TYPE_SIZE + DNS_CLASS_SIZE + /* root */ 1 + DNS_TYPE_SIZE + DNS_CLASS_SIZE + DNS_TTL_SIZE; { /* no EDNS */ PacketBuffer query; - GenericDNSPacketWriter pw(query, qname, qtype, qclass, 0); - pw.getHeader()->qr = 1; - pw.getHeader()->rcode = RCode::NXDomain; - pw.commit(); + GenericDNSPacketWriter packetWriter(query, qname, qtype, qclass, 0); + packetWriter.getHeader()->qr = 1; + packetWriter.getHeader()->rcode = RCode::NXDomain; + packetWriter.commit(); int res = getEDNSOptionsStart(query, qname.wirelength(), &optRDPosition, &remaining); @@ -1751,9 +1812,9 @@ BOOST_AUTO_TEST_CASE(test_getEDNSOptionsStart) { /* valid EDNS, no options */ PacketBuffer query; - GenericDNSPacketWriter pw(query, qname, qtype, qclass, 0); - pw.addOpt(512, 0, 0); - pw.commit(); + GenericDNSPacketWriter packetWriter(query, qname, qtype, qclass, 0); + packetWriter.addOpt(512, 0, 0); + packetWriter.commit(); int res = getEDNSOptionsStart(query, qname.wirelength(), &optRDPosition, &remaining); @@ -1771,9 +1832,9 @@ BOOST_AUTO_TEST_CASE(test_getEDNSOptionsStart) { /* valid EDNS, options */ PacketBuffer query; - GenericDNSPacketWriter pw(query, qname, qtype, qclass, 0); - pw.addOpt(512, 0, 0, opts); - pw.commit(); + GenericDNSPacketWriter packetWriter(query, qname, qtype, qclass, 0); + packetWriter.addOpt(512, 0, 0, opts); + packetWriter.commit(); int res = getEDNSOptionsStart(query, qname.wirelength(), &optRDPosition, &remaining); @@ -1794,8 +1855,8 @@ BOOST_AUTO_TEST_CASE(test_isEDNSOptionInOpt) { auto locateEDNSOption = [](const PacketBuffer& query, uint16_t code, size_t* optContentStart, uint16_t* optContentLen) { - uint16_t optStart; - size_t optLen; + uint16_t optStart = 0; + size_t optLen = 0; bool last = false; int res = locateEDNSOptRR(query, &optStart, &optLen, &last); if (res != 0) { @@ -1832,7 +1893,6 @@ BOOST_AUTO_TEST_CASE(test_isEDNSOptionInOpt) opts.emplace_back(EDNSOptionCode::ECS, ecsOptionStr); opts.emplace_back(EDNSOptionCode::COOKIE, cookiesOptionStr); */ - const ComboAddress lc("127.0.0.1"); const ComboAddress rem("127.0.0.1"); size_t optContentStart{std::numeric_limits::max()}; uint16_t optContentLen{0}; @@ -1842,10 +1902,10 @@ BOOST_AUTO_TEST_CASE(test_isEDNSOptionInOpt) { /* no EDNS */ PacketBuffer query; - GenericDNSPacketWriter pw(query, qname, qtype, qclass, 0); - pw.getHeader()->qr = 1; - pw.getHeader()->rcode = RCode::NXDomain; - pw.commit(); + GenericDNSPacketWriter packetWriter(query, qname, qtype, qclass, 0); + packetWriter.getHeader()->qr = 1; + packetWriter.getHeader()->rcode = RCode::NXDomain; + packetWriter.commit(); bool found = locateEDNSOption(query, EDNSOptionCode::ECS, &optContentStart, &optContentLen); BOOST_CHECK_EQUAL(found, false); @@ -1859,9 +1919,9 @@ BOOST_AUTO_TEST_CASE(test_isEDNSOptionInOpt) { /* valid EDNS, no options */ PacketBuffer query; - GenericDNSPacketWriter pw(query, qname, qtype, qclass, 0); - pw.addOpt(512, 0, 0); - pw.commit(); + GenericDNSPacketWriter packetWriter(query, qname, qtype, qclass, 0); + packetWriter.addOpt(512, 0, 0); + packetWriter.commit(); bool found = locateEDNSOption(query, EDNSOptionCode::ECS, &optContentStart, &optContentLen); BOOST_CHECK_EQUAL(found, false); @@ -1874,12 +1934,12 @@ BOOST_AUTO_TEST_CASE(test_isEDNSOptionInOpt) { /* valid EDNS, two cookie options but no ECS */ PacketBuffer query; - GenericDNSPacketWriter pw(query, qname, qtype, qclass, 0); + GenericDNSPacketWriter packetWriter(query, qname, qtype, qclass, 0); GenericDNSPacketWriter::optvect_t opts; opts.emplace_back(EDNSOptionCode::COOKIE, cookiesOptionStr); opts.emplace_back(EDNSOptionCode::COOKIE, cookiesOptionStr); - pw.addOpt(512, 0, 0, opts); - pw.commit(); + packetWriter.addOpt(512, 0, 0, opts); + packetWriter.commit(); bool found = locateEDNSOption(query, EDNSOptionCode::ECS, &optContentStart, &optContentLen); BOOST_CHECK_EQUAL(found, false); @@ -1892,16 +1952,16 @@ BOOST_AUTO_TEST_CASE(test_isEDNSOptionInOpt) { /* valid EDNS, two ECS */ PacketBuffer query; - GenericDNSPacketWriter pw(query, qname, qtype, qclass, 0); + GenericDNSPacketWriter packetWriter(query, qname, qtype, qclass, 0); GenericDNSPacketWriter::optvect_t opts; opts.emplace_back(EDNSOptionCode::ECS, ecsOptionStr); opts.emplace_back(EDNSOptionCode::ECS, ecsOptionStr); - pw.addOpt(512, 0, 0, opts); - pw.commit(); + packetWriter.addOpt(512, 0, 0, opts); + packetWriter.commit(); bool found = locateEDNSOption(query, EDNSOptionCode::ECS, &optContentStart, &optContentLen); BOOST_CHECK_EQUAL(found, true); - if (found == true) { + if (found) { BOOST_CHECK_EQUAL(optContentStart, optRDExpectedOffset + sizeof(uint16_t) /* RD len */ + /* option code */ 2 + /* option length */ 2); BOOST_CHECK_EQUAL(optContentLen, sizeOfECSContent); } @@ -1914,17 +1974,17 @@ BOOST_AUTO_TEST_CASE(test_isEDNSOptionInOpt) { /* valid EDNS, one ECS between two cookies */ PacketBuffer query; - GenericDNSPacketWriter pw(query, qname, qtype, qclass, 0); + GenericDNSPacketWriter packetWriter(query, qname, qtype, qclass, 0); GenericDNSPacketWriter::optvect_t opts; opts.emplace_back(EDNSOptionCode::COOKIE, cookiesOptionStr); opts.emplace_back(EDNSOptionCode::ECS, ecsOptionStr); opts.emplace_back(EDNSOptionCode::COOKIE, cookiesOptionStr); - pw.addOpt(512, 0, 0, opts); - pw.commit(); + packetWriter.addOpt(512, 0, 0, opts); + packetWriter.commit(); bool found = locateEDNSOption(query, EDNSOptionCode::ECS, &optContentStart, &optContentLen); BOOST_CHECK_EQUAL(found, true); - if (found == true) { + if (found) { BOOST_CHECK_EQUAL(optContentStart, optRDExpectedOffset + sizeof(uint16_t) /* RD len */ + sizeOfCookieOption + /* option code */ 2 + /* option length */ 2); BOOST_CHECK_EQUAL(optContentLen, sizeOfECSContent); } @@ -1937,16 +1997,16 @@ BOOST_AUTO_TEST_CASE(test_isEDNSOptionInOpt) { /* valid EDNS, one 65002 after an ECS */ PacketBuffer query; - GenericDNSPacketWriter pw(query, qname, qtype, qclass, 0); + GenericDNSPacketWriter packetWriter(query, qname, qtype, qclass, 0); GenericDNSPacketWriter::optvect_t opts; opts.emplace_back(EDNSOptionCode::ECS, ecsOptionStr); opts.emplace_back(65535, cookiesOptionStr); - pw.addOpt(512, 0, 0, opts); - pw.commit(); + packetWriter.addOpt(512, 0, 0, opts); + packetWriter.commit(); bool found = locateEDNSOption(query, 65535, &optContentStart, &optContentLen); BOOST_CHECK_EQUAL(found, true); - if (found == true) { + if (found) { BOOST_CHECK_EQUAL(optContentStart, optRDExpectedOffset + sizeof(uint16_t) /* RD len */ + sizeOfECSOption + /* option code */ 2 + /* option length */ 2); BOOST_CHECK_EQUAL(optContentLen, cookiesOptionStr.size()); } @@ -1968,23 +2028,24 @@ BOOST_AUTO_TEST_CASE(test_setNegativeAndAdditionalSOA) PacketBuffer query; PacketBuffer queryWithEDNS; - GenericDNSPacketWriter pw(query, name, QType::A, QClass::IN, 0); - pw.getHeader()->rd = 1; - GenericDNSPacketWriter pwEDNS(queryWithEDNS, name, QType::A, QClass::IN, 0); - pwEDNS.getHeader()->rd = 1; - pwEDNS.addOpt(1232, 0, 0); - pwEDNS.commit(); + GenericDNSPacketWriter packetWriter(query, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->rd = 1; + GenericDNSPacketWriter packetWriterEDNS(queryWithEDNS, name, QType::A, QClass::IN, 0); + packetWriterEDNS.getHeader()->rd = 1; + packetWriterEDNS.addOpt(1232, 0, 0); + packetWriterEDNS.commit(); /* test NXD */ { /* no incoming EDNS */ auto packet = query; - + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) ids.qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &ids.qtype, nullptr); - DNSQuestion dq(ids, packet); + DNSQuestion dnsQuestion(ids, packet); - BOOST_CHECK(setNegativeAndAdditionalSOA(dq, true, DNSName("zone."), 42, DNSName("mname."), DNSName("rname."), 1, 2, 3, 4, 5, false)); + BOOST_CHECK(setNegativeAndAdditionalSOA(dnsQuestion, true, DNSName("zone."), 42, DNSName("mname."), DNSName("rname."), 1, 2, 3, 4, 5, false)); BOOST_CHECK(packet.size() > query.size()); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) MOADNSParser mdp(true, reinterpret_cast(packet.data()), packet.size()); BOOST_CHECK_EQUAL(mdp.d_qname.toString(), "www.powerdns.com."); @@ -2001,12 +2062,13 @@ BOOST_AUTO_TEST_CASE(test_setNegativeAndAdditionalSOA) { /* now with incoming EDNS */ auto packet = queryWithEDNS; - + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) ids.qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &ids.qtype, nullptr); - DNSQuestion dq(ids, packet); + DNSQuestion dnsQuestion(ids, packet); - BOOST_CHECK(setNegativeAndAdditionalSOA(dq, true, DNSName("zone."), 42, DNSName("mname."), DNSName("rname."), 1, 2, 3, 4, 5, false)); + BOOST_CHECK(setNegativeAndAdditionalSOA(dnsQuestion, true, DNSName("zone."), 42, DNSName("mname."), DNSName("rname."), 1, 2, 3, 4, 5, false)); BOOST_CHECK(packet.size() > queryWithEDNS.size()); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) MOADNSParser mdp(true, reinterpret_cast(packet.data()), packet.size()); BOOST_CHECK_EQUAL(mdp.d_qname.toString(), "www.powerdns.com."); @@ -2027,12 +2089,13 @@ BOOST_AUTO_TEST_CASE(test_setNegativeAndAdditionalSOA) { /* no incoming EDNS */ auto packet = query; - + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) ids.qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &ids.qtype, nullptr); - DNSQuestion dq(ids, packet); + DNSQuestion dnsQuestion(ids, packet); - BOOST_CHECK(setNegativeAndAdditionalSOA(dq, false, DNSName("zone."), 42, DNSName("mname."), DNSName("rname."), 1, 2, 3, 4, 5, false)); + BOOST_CHECK(setNegativeAndAdditionalSOA(dnsQuestion, false, DNSName("zone."), 42, DNSName("mname."), DNSName("rname."), 1, 2, 3, 4, 5, false)); BOOST_CHECK(packet.size() > query.size()); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) MOADNSParser mdp(true, reinterpret_cast(packet.data()), packet.size()); BOOST_CHECK_EQUAL(mdp.d_qname.toString(), "www.powerdns.com."); @@ -2049,12 +2112,13 @@ BOOST_AUTO_TEST_CASE(test_setNegativeAndAdditionalSOA) { /* now with incoming EDNS */ auto packet = queryWithEDNS; - + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) ids.qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &ids.qtype, nullptr); - DNSQuestion dq(ids, packet); + DNSQuestion dnsQuestion(ids, packet); - BOOST_CHECK(setNegativeAndAdditionalSOA(dq, false, DNSName("zone."), 42, DNSName("mname."), DNSName("rname."), 1, 2, 3, 4, 5, false)); + BOOST_CHECK(setNegativeAndAdditionalSOA(dnsQuestion, false, DNSName("zone."), 42, DNSName("mname."), DNSName("rname."), 1, 2, 3, 4, 5, false)); BOOST_CHECK(packet.size() > queryWithEDNS.size()); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) MOADNSParser mdp(true, reinterpret_cast(packet.data()), packet.size()); BOOST_CHECK_EQUAL(mdp.d_qname.toString(), "www.powerdns.com."); @@ -2077,13 +2141,14 @@ BOOST_AUTO_TEST_CASE(test_setNegativeAndAdditionalSOA) { /* no incoming EDNS */ auto packet = query; - + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) ids.qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &ids.qtype, nullptr); - DNSQuestion dq(ids, packet); + DNSQuestion dnsQuestion(ids, packet); - BOOST_CHECK(setNegativeAndAdditionalSOA(dq, true, DNSName("zone."), 42, DNSName("mname."), DNSName("rname."), 1, 2, 3, 4, + BOOST_CHECK(setNegativeAndAdditionalSOA(dnsQuestion, true, DNSName("zone."), 42, DNSName("mname."), DNSName("rname."), 1, 2, 3, 4, 5, true)); BOOST_CHECK(packet.size() > query.size()); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) MOADNSParser mdp(true, reinterpret_cast(packet.data()), packet.size()); BOOST_CHECK_EQUAL(mdp.d_qname.toString(), "www.powerdns.com."); @@ -2100,12 +2165,13 @@ BOOST_AUTO_TEST_CASE(test_setNegativeAndAdditionalSOA) { /* now with incoming EDNS */ auto packet = queryWithEDNS; - + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) ids.qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &ids.qtype, nullptr); - DNSQuestion dq(ids, packet); + DNSQuestion dnsQuestion(ids, packet); - BOOST_CHECK(setNegativeAndAdditionalSOA(dq, true, DNSName("zone."), 42, DNSName("mname."), DNSName("rname."), 1, 2, 3, 4, 5, true)); + BOOST_CHECK(setNegativeAndAdditionalSOA(dnsQuestion, true, DNSName("zone."), 42, DNSName("mname."), DNSName("rname."), 1, 2, 3, 4, 5, true)); BOOST_CHECK(packet.size() > queryWithEDNS.size()); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) MOADNSParser mdp(true, reinterpret_cast(packet.data()), packet.size()); BOOST_CHECK_EQUAL(mdp.d_qname.toString(), "www.powerdns.com."); @@ -2126,12 +2192,13 @@ BOOST_AUTO_TEST_CASE(test_setNegativeAndAdditionalSOA) { /* no incoming EDNS */ auto packet = query; - + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) ids.qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &ids.qtype, nullptr); - DNSQuestion dq(ids, packet); + DNSQuestion dnsQuestion(ids, packet); - BOOST_CHECK(setNegativeAndAdditionalSOA(dq, false, DNSName("zone."), 42, DNSName("mname."), DNSName("rname."), 1, 2, 3, 4, 5, true)); + BOOST_CHECK(setNegativeAndAdditionalSOA(dnsQuestion, false, DNSName("zone."), 42, DNSName("mname."), DNSName("rname."), 1, 2, 3, 4, 5, true)); BOOST_CHECK(packet.size() > query.size()); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) MOADNSParser mdp(true, reinterpret_cast(packet.data()), packet.size()); BOOST_CHECK_EQUAL(mdp.d_qname.toString(), "www.powerdns.com."); @@ -2148,12 +2215,13 @@ BOOST_AUTO_TEST_CASE(test_setNegativeAndAdditionalSOA) { /* now with incoming EDNS */ auto packet = queryWithEDNS; - + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) ids.qname = DNSName(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &ids.qtype, nullptr); - DNSQuestion dq(ids, packet); + DNSQuestion dnsQuestion(ids, packet); - BOOST_CHECK(setNegativeAndAdditionalSOA(dq, false, DNSName("zone."), 42, DNSName("mname."), DNSName("rname."), 1, 2, 3, 4, 5, true)); + BOOST_CHECK(setNegativeAndAdditionalSOA(dnsQuestion, false, DNSName("zone."), 42, DNSName("mname."), DNSName("rname."), 1, 2, 3, 4, 5, true)); BOOST_CHECK(packet.size() > queryWithEDNS.size()); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) MOADNSParser mdp(true, reinterpret_cast(packet.data()), packet.size()); BOOST_CHECK_EQUAL(mdp.d_qname.toString(), "www.powerdns.com."); @@ -2178,67 +2246,70 @@ BOOST_AUTO_TEST_CASE(getEDNSOptionsWithoutEDNS) ids.protocol = dnsdist::Protocol::DoUDP; const DNSName name("www.powerdns.com."); - const ComboAddress v4("192.0.2.1"); + const ComboAddress v4Addr("192.0.2.1"); { /* no EDNS and no other additional record */ PacketBuffer query; - GenericDNSPacketWriter pw(query, name, QType::A, QClass::IN, 0); - pw.getHeader()->rd = 1; - pw.commit(); + GenericDNSPacketWriter packetWriter(query, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->rd = 1; + packetWriter.commit(); /* large enough packet */ auto packet = query; unsigned int consumed = 0; - uint16_t qtype; - uint16_t qclass; + uint16_t qtype = 0; + uint16_t qclass = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) DNSName qname(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, &qclass, &consumed); - DNSQuestion dq(ids, packet); + DNSQuestion dnsQuestion(ids, packet); - BOOST_CHECK(!parseEDNSOptions(dq)); + BOOST_CHECK(!parseEDNSOptions(dnsQuestion)); } { /* nothing in additional (so no EDNS) but a record in ANSWER */ PacketBuffer query; - GenericDNSPacketWriter pw(query, name, QType::A, QClass::IN, 0); - pw.getHeader()->rd = 1; - pw.startRecord(name, QType::A, 60, QClass::IN, DNSResourceRecord::ANSWER); - pw.xfrIP(v4.sin4.sin_addr.s_addr); - pw.commit(); + GenericDNSPacketWriter packetWriter(query, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->rd = 1; + packetWriter.startRecord(name, QType::A, 60, QClass::IN, DNSResourceRecord::ANSWER); + packetWriter.xfrIP(v4Addr.sin4.sin_addr.s_addr); + packetWriter.commit(); /* large enough packet */ auto packet = query; unsigned int consumed = 0; - uint16_t qtype; - uint16_t qclass; + uint16_t qtype = 0; + uint16_t qclass = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) DNSName qname(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, &qclass, &consumed); - DNSQuestion dq(ids, packet); + DNSQuestion dnsQuestion(ids, packet); - BOOST_CHECK(!parseEDNSOptions(dq)); + BOOST_CHECK(!parseEDNSOptions(dnsQuestion)); } { /* nothing in additional (so no EDNS) but a record in AUTHORITY */ PacketBuffer query; - GenericDNSPacketWriter pw(query, name, QType::A, QClass::IN, 0); - pw.getHeader()->rd = 1; - pw.startRecord(name, QType::A, 60, QClass::IN, DNSResourceRecord::AUTHORITY); - pw.xfrIP(v4.sin4.sin_addr.s_addr); - pw.commit(); + GenericDNSPacketWriter packetWriter(query, name, QType::A, QClass::IN, 0); + packetWriter.getHeader()->rd = 1; + packetWriter.startRecord(name, QType::A, 60, QClass::IN, DNSResourceRecord::AUTHORITY); + packetWriter.xfrIP(v4Addr.sin4.sin_addr.s_addr); + packetWriter.commit(); /* large enough packet */ auto packet = query; unsigned int consumed = 0; - uint16_t qtype; - uint16_t qclass; + uint16_t qtype = 0; + uint16_t qclass = 0; + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) DNSName qname(reinterpret_cast(packet.data()), packet.size(), sizeof(dnsheader), false, &qtype, &qclass, &consumed); - DNSQuestion dq(ids, packet); + DNSQuestion dnsQuestion(ids, packet); - BOOST_CHECK(!parseEDNSOptions(dq)); + BOOST_CHECK(!parseEDNSOptions(dnsQuestion)); } } @@ -2253,24 +2324,25 @@ BOOST_AUTO_TEST_CASE(test_setEDNSOption) ids.qclass = QClass::IN; ids.queryRealTime.start(); - struct timespec expiredTime; + timespec expiredTime{}; /* the internal QPS limiter does not use the real time */ gettime(&expiredTime); PacketBuffer packet; - GenericDNSPacketWriter pw(packet, ids.qname, ids.qtype, ids.qclass, 0); - pw.addOpt(4096, 0, EDNS_HEADER_FLAG_DO); - pw.commit(); + GenericDNSPacketWriter packetWriter(packet, ids.qname, ids.qtype, ids.qclass, 0); + packetWriter.addOpt(4096, 0, EDNS_HEADER_FLAG_DO); + packetWriter.commit(); - DNSQuestion dq(ids, packet); + DNSQuestion dnsQuestion(ids, packet); std::string result; EDNSCookiesOpt cookiesOpt("deadbeefdeadbeef"); string cookiesOptionStr = cookiesOpt.makeOptString(); - BOOST_REQUIRE(setEDNSOption(dq, EDNSOptionCode::COOKIE, cookiesOptionStr)); + BOOST_REQUIRE(setEDNSOption(dnsQuestion, EDNSOptionCode::COOKIE, cookiesOptionStr)); - const auto& data = dq.getData(); + const auto& data = dnsQuestion.getData(); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) MOADNSParser mdp(true, reinterpret_cast(data.data()), data.size()); BOOST_CHECK_EQUAL(mdp.d_qname.toString(), ids.qname.toString()); @@ -2281,17 +2353,17 @@ BOOST_AUTO_TEST_CASE(test_setEDNSOption) BOOST_CHECK_EQUAL(mdp.d_answers.at(0).first.d_type, static_cast(QType::OPT)); BOOST_CHECK_EQUAL(mdp.d_answers.at(0).first.d_name, g_rootdnsname); - EDNS0Record edns0; - BOOST_REQUIRE(getEDNS0Record(dq.getData(), edns0)); + EDNS0Record edns0{}; + BOOST_REQUIRE(getEDNS0Record(dnsQuestion.getData(), edns0)); BOOST_CHECK_EQUAL(edns0.version, 0U); BOOST_CHECK_EQUAL(edns0.extRCode, 0U); BOOST_CHECK_EQUAL(edns0.extFlags, EDNS_HEADER_FLAG_DO); - BOOST_REQUIRE(parseEDNSOptions(dq)); - BOOST_REQUIRE(dq.ednsOptions != nullptr); - BOOST_CHECK_EQUAL(dq.ednsOptions->size(), 1U); - const auto& ecsOption = dq.ednsOptions->find(EDNSOptionCode::COOKIE); - BOOST_REQUIRE(ecsOption != dq.ednsOptions->cend()); + BOOST_REQUIRE(parseEDNSOptions(dnsQuestion)); + BOOST_REQUIRE(dnsQuestion.ednsOptions != nullptr); + BOOST_CHECK_EQUAL(dnsQuestion.ednsOptions->size(), 1U); + const auto& ecsOption = dnsQuestion.ednsOptions->find(EDNSOptionCode::COOKIE); + BOOST_REQUIRE(ecsOption != dnsQuestion.ednsOptions->cend()); BOOST_REQUIRE_EQUAL(ecsOption->second.values.size(), 1U); BOOST_CHECK_EQUAL(cookiesOptionStr, std::string(ecsOption->second.values.at(0).content, ecsOption->second.values.at(0).size)); -- 2.47.2