diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-13 21:14:49 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-13 21:14:49 +0000 |
commit | 2f230033794fafdf10822568e763d4db68cf6c6b (patch) | |
tree | 39ca5c2325b7b43c9a28ca6d4ad4026a61e7eb97 /ednssubnet.cc | |
parent | Adding debian version 1.8.3-3. (diff) | |
download | dnsdist-2f230033794fafdf10822568e763d4db68cf6c6b.tar.xz dnsdist-2f230033794fafdf10822568e763d4db68cf6c6b.zip |
Merging upstream version 1.9.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'ednssubnet.cc')
-rw-r--r-- | ednssubnet.cc | 82 |
1 files changed, 46 insertions, 36 deletions
diff --git a/ednssubnet.cc b/ednssubnet.cc index cf78ecf..a4c3e28 100644 --- a/ednssubnet.cc +++ b/ednssubnet.cc @@ -25,60 +25,69 @@ #include "ednssubnet.hh" #include "dns.hh" -namespace { - struct EDNSSubnetOptsWire - { - uint16_t family; - uint8_t sourceMask; - uint8_t scopeMask; - } GCCPACKATTRIBUTE; // BRRRRR +namespace +{ +struct EDNSSubnetOptsWire +{ + uint16_t family; + uint8_t sourceMask; + uint8_t scopeMask; +} GCCPACKATTRIBUTE; // BRRRRR } bool getEDNSSubnetOptsFromString(const string& options, EDNSSubnetOpts* eso) { - //cerr<<"options.size:"<<options.size()<<endl; + // cerr<<"options.size:"<<options.size()<<endl; return getEDNSSubnetOptsFromString(options.c_str(), options.length(), eso); } bool getEDNSSubnetOptsFromString(const char* options, unsigned int len, EDNSSubnetOpts* eso) { - EDNSSubnetOptsWire esow; - static_assert (sizeof(esow) == 4, "sizeof(EDNSSubnetOptsWire) must be 4 bytes"); - if(len < sizeof(esow)) + EDNSSubnetOptsWire esow{}; + static_assert(sizeof(esow) == 4, "sizeof(EDNSSubnetOptsWire) must be 4 bytes"); + if (len < sizeof(esow)) { return false; + } memcpy(&esow, options, sizeof(esow)); esow.family = ntohs(esow.family); - //cerr<<"Family when parsing from string: "<<esow.family<<endl; + // cerr<<"Family when parsing from string: "<<esow.family<<endl; ComboAddress address; - unsigned int octetsin = esow.sourceMask > 0 ? (((esow.sourceMask - 1)>> 3)+1) : 0; - //cerr<<"octetsin:"<<octetsin<<endl; - if(esow.family == 1) { - if(len != sizeof(esow)+octetsin) + unsigned int octetsin = esow.sourceMask > 0 ? (((esow.sourceMask - 1) >> 3) + 1) : 0; + // cerr<<"octetsin:"<<octetsin<<endl; + if (esow.family == 1) { + if (len != sizeof(esow) + octetsin) { return false; - if(octetsin > sizeof(address.sin4.sin_addr.s_addr)) + } + if (octetsin > sizeof(address.sin4.sin_addr.s_addr)) { return false; + } address.reset(); address.sin4.sin_family = AF_INET; - if(octetsin > 0) - memcpy(&address.sin4.sin_addr.s_addr, options+sizeof(esow), octetsin); - } else if(esow.family == 2) { - if(len != sizeof(esow)+octetsin) + if (octetsin > 0) { + memcpy(&address.sin4.sin_addr.s_addr, options + sizeof(esow), octetsin); // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic) + } + } + else if (esow.family == 2) { + if (len != sizeof(esow) + octetsin) { return false; - if(octetsin > sizeof(address.sin6.sin6_addr.s6_addr)) + } + if (octetsin > sizeof(address.sin6.sin6_addr.s6_addr)) { return false; + } address.reset(); address.sin4.sin_family = AF_INET6; - if(octetsin > 0) - memcpy(&address.sin6.sin6_addr.s6_addr, options+sizeof(esow), octetsin); + if (octetsin > 0) { + memcpy(&address.sin6.sin6_addr.s6_addr, options + sizeof(esow), octetsin); // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic) + } } - else + else { return false; - //cerr<<"Source address: "<<address.toString()<<", mask: "<<(int)esow.sourceMask<<endl; + } eso->source = Netmask(address, esow.sourceMask); /* 'address' has more bits set (potentially) than scopeMask. This leads to odd looking netmasks that promise more precision than they have. For this reason we truncate the address to scopeMask bits */ - + address.truncate(esow.scopeMask); // truncate will not throw for odd scopeMasks eso->scope = Netmask(address, esow.scopeMask); @@ -88,21 +97,22 @@ bool getEDNSSubnetOptsFromString(const char* options, unsigned int len, EDNSSubn string makeEDNSSubnetOptsString(const EDNSSubnetOpts& eso) { string ret; - EDNSSubnetOptsWire esow; + EDNSSubnetOptsWire esow{}; uint16_t family = htons(eso.source.getNetwork().sin4.sin_family == AF_INET ? 1 : 2); esow.family = family; esow.sourceMask = eso.source.getBits(); esow.scopeMask = eso.scope.getBits(); - ret.assign((const char*)&esow, sizeof(esow)); - int octetsout = ((esow.sourceMask - 1)>> 3)+1; + ret.assign((const char*)&esow, sizeof(esow)); // NOLINT(cppcoreguidelines-pro-type-cstyle-cast) + int octetsout = ((esow.sourceMask - 1) >> 3) + 1; - ComboAddress src=eso.source.getNetwork(); + ComboAddress src = eso.source.getNetwork(); src.truncate(esow.sourceMask); - if(family == htons(1)) - ret.append((const char*) &src.sin4.sin_addr.s_addr, octetsout); - else - ret.append((const char*) &src.sin6.sin6_addr.s6_addr, octetsout); + if (family == htons(1)) { + ret.append((const char*)&src.sin4.sin_addr.s_addr, octetsout); // NOLINT(cppcoreguidelines-pro-type-cstyle-cast) + } + else { + ret.append((const char*)&src.sin6.sin6_addr.s6_addr, octetsout); // NOLINT(cppcoreguidelines-pro-type-cstyle-cast) + } return ret; } - |