void TeeAction::worker()
{
setThreadName("dnsdist/TeeWork");
- std::array<char, 1500> packet;
+ std::array<char, s_udpIncomingBufferSize> packet{};
ssize_t res = 0;
const dnsheader_aligned dh(packet.data());
for (;;) {
d_responses++;
}
+ // NOLINTNEXTLINE(bugprone-narrowing-conversions): rcode is unsigned, RCode::rcodes_ as well
if (dh->rcode == RCode::NoError) {
d_noerrors++;
}
+ // NOLINTNEXTLINE(bugprone-narrowing-conversions): rcode is unsigned, RCode::rcodes_ as well
else if (dh->rcode == RCode::ServFail) {
d_servfails++;
}
+ // NOLINTNEXTLINE(bugprone-narrowing-conversions): rcode is unsigned, RCode::rcodes_ as well
else if (dh->rcode == RCode::NXDomain) {
d_nxdomains++;
}
+ // NOLINTNEXTLINE(bugprone-narrowing-conversions): rcode is unsigned, RCode::rcodes_ as well
else if (dh->rcode == RCode::Refused) {
d_refuseds++;
}
+ // NOLINTNEXTLINE(bugprone-narrowing-conversions): rcode is unsigned, RCode::rcodes_ as well
else if (dh->rcode == RCode::FormErr) {
d_formerrs++;
}
+ // NOLINTNEXTLINE(bugprone-narrowing-conversions): rcode is unsigned, RCode::rcodes_ as well
else if (dh->rcode == RCode::NotImp) {
d_notimps++;
}
#include "dnsdist-lua.hh"
#include "dnsparser.hh"
+// NOLINTNEXTLINE(readability-function-cognitive-complexity): this function declares Lua bindings, even with a good refactoring it will likely blow up the threshold
void setupLuaBindingsDNSQuestion(LuaContext& luaCtx)
{
#ifndef DISABLE_NON_FFI_DQ_BINDINGS
});
luaCtx.registerMember<const ComboAddress (DNSQuestion::*)>("remoteaddr", [](const DNSQuestion& dq) -> const ComboAddress { return dq.ids.origRemote; }, [](DNSQuestion& dq, const ComboAddress newRemote) { (void) newRemote; });
/* DNSDist DNSQuestion */
- luaCtx.registerMember<dnsheader* (DNSQuestion::*)>("dh", [](const DNSQuestion& dq) -> dnsheader* { return const_cast<DNSQuestion&>(dq).getMutableHeader(); }, [](DNSQuestion& dq, const dnsheader* dh) {
+ luaCtx.registerMember<dnsheader* (DNSQuestion::*)>("dh", [](const DNSQuestion& dq) -> dnsheader* { return dq.getMutableHeader(); }, [](DNSQuestion& dq, const dnsheader* dh) {
dnsdist::PacketMangling::editDNSHeaderFromPacket(dq.getMutableData(), [&dh](dnsheader& header) {
header = *dh;
return true;
dq.ids.d_protoBufData->d_requestorID = newValue;
});
luaCtx.registerFunction<bool(DNSQuestion::*)()const>("getDO", [](const DNSQuestion& dq) {
- return getEDNSZ(dq) & EDNS_HEADER_FLAG_DO;
+ return getEDNSZ(dq) & EDNS_HEADER_FLAG_DO;
});
luaCtx.registerFunction<std::string(DNSQuestion::*)()const>("getContent", [](const DNSQuestion& dq) {
return std::string(reinterpret_cast<const char*>(dq.getData().data()), dq.getData().size());
buffer.clear();
buffer.insert(buffer.begin(), raw.begin(), raw.end());
- reinterpret_cast<dnsheader*>(buffer.data())->id = oldID;
dnsdist::PacketMangling::editDNSHeaderFromPacket(buffer, [oldID](dnsheader& header) {
header.id = oldID;
return true;
luaCtx.registerMember<uint16_t (DNSResponse::*)>("qclass", [](const DNSResponse& dq) -> uint16_t { return dq.ids.qclass; }, [](DNSResponse& dq, uint16_t newClass) { (void) newClass; });
luaCtx.registerMember<int (DNSResponse::*)>("rcode", [](const DNSResponse& dq) -> int { return dq.getHeader()->rcode; }, [](DNSResponse& dq, int newRCode) {
dnsdist::PacketMangling::editDNSHeaderFromPacket(dq.getMutableData(), [newRCode](dnsheader& header) {
- header.rcode = newRCode;
- return true;
+ if (newRCode >= 0 && newRCode <= std::numeric_limits<decltype(dnsheader::rcode)>::max()) {
+ header.rcode = static_cast<decltype(dnsheader::rcode)>(newRCode);
+ return true;
+ }
+ return false;
});
});
luaCtx.registerMember<const ComboAddress (DNSResponse::*)>("remoteaddr", [](const DNSResponse& dq) -> const ComboAddress { return dq.ids.origRemote; }, [](DNSResponse& dq, const ComboAddress newRemote) { (void) newRemote; });
- luaCtx.registerMember<dnsheader* (DNSResponse::*)>("dh", [](const DNSResponse& dr) -> dnsheader* { return const_cast<DNSResponse&>(dr).getMutableHeader(); }, [](DNSResponse& dr, const dnsheader* dh) {
+ luaCtx.registerMember<dnsheader* (DNSResponse::*)>("dh", [](const DNSResponse& dr) -> dnsheader* { return dr.getMutableHeader(); }, [](DNSResponse& dr, const dnsheader* dh) {
dnsdist::PacketMangling::editDNSHeaderFromPacket(dr.getMutableData(), [&dh](dnsheader& header) {
header = *dh;
return true;
std::string DNSQuestion::getTrailingData() const
{
- const char* message = reinterpret_cast<const char*>(this->getData().data());
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
+ const auto* message = reinterpret_cast<const char*>(this->getData().data());
const uint16_t messageLen = getDNSPacketLength(message, this->getData().size());
return std::string(message + messageLen, this->getData().size() - messageLen);
}
return true;
}
-bool DNSQuestion::editHeader(std::function<bool(dnsheader&)> editFunction)
+bool DNSQuestion::editHeader(const std::function<bool(dnsheader&)>& editFunction)
{
if (data.size() < sizeof(dnsheader)) {
throw std::runtime_error("Trying to access the dnsheader of a too small (" + std::to_string(data.size()) + ") DNSQuestion buffer");
static bool applyRulesToQuery(LocalHolders& holders, DNSQuestion& dq, const struct timespec& now)
{
- auto setRCode = [&dq](uint8_t rcode) {
- dnsdist::PacketMangling::editDNSHeaderFromPacket(dq.getMutableData(), [rcode](dnsheader& header) {
- header.rcode = rcode;
- header.qr = true;
- return true;
- });
- };
-
if (g_rings.shouldRecordQueries()) {
g_rings.insertQuery(now, dq.ids.origRemote, dq.ids.qname, dq.ids.qtype, dq.getData().size(), *dq.getHeader(), dq.getProtocol());
}
}
#ifndef DISABLE_DYNBLOCKS
+ auto setRCode = [&dq](uint8_t rcode) {
+ dnsdist::PacketMangling::editDNSHeaderFromPacket(dq.getMutableData(), [rcode](dnsheader& header) {
+ header.rcode = rcode;
+ header.qr = true;
+ return true;
+ });
+ };
+
/* the Dynamic Block mechanism supports address and port ranges, so we need to pass the full address and port */
if (auto got = holders.dynNMGBlock->lookup(AddressAndPortRange(dq.ids.origRemote, dq.ids.origRemote.isIPv4() ? 32 : 128, 16))) {
auto updateBlockStats = [&got]() {
return data;
}
- bool editHeader(std::function<bool(dnsheader&)> editFunction);
+ bool editHeader(const std::function<bool(dnsheader&)>& editFunction);
const dnsheader_aligned getHeader() const
{
/* this function is not safe against unaligned access, you should
use editHeader() instead, but we need it for the Lua bindings */
- dnsheader* getMutableHeader()
+ dnsheader* getMutableHeader() const
{
if (data.size() < sizeof(dnsheader)) {
throw std::runtime_error("Trying to access the dnsheader of a too small (" + std::to_string(data.size()) + ") DNSQuestion buffer");