bool g_ECSOverride{false};
-int rewriteResponseWithoutEDNS(const char * packet, const size_t len, vector<uint8_t>& newContent)
+int rewriteResponseWithoutEDNS(const std::string& initialPacket, vector<uint8_t>& newContent)
{
- assert(packet != NULL);
- assert(len >= sizeof(dnsheader));
- const struct dnsheader* dh = (const struct dnsheader*) packet;
+ assert(initialPacket.size() >= sizeof(dnsheader));
+ const struct dnsheader* dh = reinterpret_cast<const struct dnsheader*>(initialPacket.data());
if (ntohs(dh->arcount) == 0)
return ENOENT;
if (ntohs(dh->qdcount) == 0)
return ENOENT;
- std::string packetStr(packet, len);
- PacketReader pr(packetStr);
-
+ PacketReader pr(initialPacket);
+
size_t idx = 0;
DNSName rrname;
uint16_t qdcount = ntohs(dh->qdcount);
return 0;
}
-int locateEDNSOptRR(char * packet, const size_t len, char ** optStart, size_t * optLen, bool * last)
+int locateEDNSOptRR(const std::string& packet, uint16_t * optStart, size_t * optLen, bool * last)
{
- assert(packet != NULL);
assert(optStart != NULL);
assert(optLen != NULL);
assert(last != NULL);
- const struct dnsheader* dh = (const struct dnsheader*) packet;
+ const struct dnsheader* dh = reinterpret_cast<const struct dnsheader*>(packet.data());
if (ntohs(dh->arcount) == 0)
return ENOENT;
- std::string packetStr(packet, len);
- PacketReader pr(packetStr);
+ PacketReader pr(packet);
size_t idx = 0;
DNSName rrname;
uint16_t qdcount = ntohs(dh->qdcount);
pr.getDnsrecordheader(ah);
if (ah.d_type == QType::OPT) {
- *optStart = packet + start;
+ *optStart = start;
*optLen = (pr.getPosition() - start) + ah.d_clen;
- if ((packet + len) < (*optStart + *optLen)) {
+ if (packet.size() < (*optStart + *optLen)) {
throw std::range_error("Opt record overflow");
}
return 0;
}
-int rewriteResponseWithoutEDNSOption(const char * packet, const size_t len, const uint16_t optionCodeToSkip, vector<uint8_t>& newContent)
+int rewriteResponseWithoutEDNSOption(const std::string& initialPacket, const uint16_t optionCodeToSkip, vector<uint8_t>& newContent)
{
- assert(packet != NULL);
- assert(len >= sizeof(dnsheader));
- const struct dnsheader* dh = (const struct dnsheader*) packet;
+ assert(initialPacket.size() >= sizeof(dnsheader));
+ const struct dnsheader* dh = reinterpret_cast<const struct dnsheader*>(initialPacket.data());
if (ntohs(dh->arcount) == 0)
return ENOENT;
if (ntohs(dh->qdcount) == 0)
return ENOENT;
- std::string packetStr(packet, len);
- PacketReader pr(packetStr);
+ PacketReader pr(initialPacket);
size_t idx = 0;
DNSName rrname;
}
if (ednsAdded || ecsAdded) {
- char * optStart = NULL;
+ uint16_t optStart = NULL;
size_t optLen = 0;
bool last = false;
- int res = locateEDNSOptRR(*response, *responseLen, &optStart, &optLen, &last);
+ const std::string responseStr(*response, *responseLen);
+ int res = locateEDNSOptRR(responseStr, &optStart, &optLen, &last);
if (res == 0) {
if (ednsAdded) {
}
else {
/* Removing an intermediary RR could lead to compression error */
- if (rewriteResponseWithoutEDNS(*response, *responseLen, rewrittenResponse) == 0) {
+ if (rewriteResponseWithoutEDNS(responseStr, rewrittenResponse) == 0) {
*responseLen = rewrittenResponse.size();
if (addRoom && (UINT16_MAX - *responseLen) > addRoom) {
rewrittenResponse.reserve(*responseLen + addRoom);
/* nothing after the OPT RR, we can simply remove the
ECS option */
size_t existingOptLen = optLen;
- removeEDNSOptionFromOPT(optStart, &optLen, EDNSOptionCode::ECS);
+ removeEDNSOptionFromOPT(*response + optStart, &optLen, EDNSOptionCode::ECS);
*responseLen -= (existingOptLen - optLen);
}
else {
/* Removing an intermediary RR could lead to compression error */
- if (rewriteResponseWithoutEDNSOption(*response, *responseLen, EDNSOptionCode::ECS, rewrittenResponse) == 0) {
+ if (rewriteResponseWithoutEDNSOption(responseStr, EDNSOptionCode::ECS, rewrittenResponse) == 0) {
*responseLen = rewrittenResponse.size();
if (addRoom && (UINT16_MAX - *responseLen) > addRoom) {
rewrittenResponse.reserve(*responseLen + addRoom);
pw.commit();
vector<uint8_t> newResponse;
- int res = rewriteResponseWithoutEDNS((const char *) response.data(), response.size(), newResponse);
+ int res = rewriteResponseWithoutEDNS(std::string((const char *) response.data(), response.size()), newResponse);
BOOST_CHECK_EQUAL(res, 0);
unsigned int consumed = 0;
pw.commit();
vector<uint8_t> newResponse;
- int res = rewriteResponseWithoutEDNS((const char *) response.data(), response.size(), newResponse);
+ int res = rewriteResponseWithoutEDNS(std::string((const char *) response.data(), response.size()), newResponse);
BOOST_CHECK_EQUAL(res, 0);
unsigned int consumed = 0;
pw.commit();
vector<uint8_t> newResponse;
- int res = rewriteResponseWithoutEDNS((const char *) response.data(), response.size(), newResponse);
+ int res = rewriteResponseWithoutEDNS(std::string((const char *) response.data(), response.size()), newResponse);
BOOST_CHECK_EQUAL(res, 0);
pw.addOpt(512, 0, 0, opts);
pw.commit();
- char * optStart = NULL;
+ uint16_t optStart;
size_t optLen = 0;
bool last = false;
- int res = locateEDNSOptRR((char *) response.data(), response.size(), &optStart, &optLen, &last);
+ int res = locateEDNSOptRR(std::string((char *) response.data(), response.size()), &optStart, &optLen, &last);
BOOST_CHECK_EQUAL(res, 0);
BOOST_CHECK_EQUAL(last, true);
size_t responseLen = response.size();
size_t existingOptLen = optLen;
BOOST_CHECK(existingOptLen < responseLen);
- res = removeEDNSOptionFromOPT(optStart, &optLen, EDNSOptionCode::ECS);
+ res = removeEDNSOptionFromOPT(reinterpret_cast<char *>(response.data()) + optStart, &optLen, EDNSOptionCode::ECS);
BOOST_CHECK_EQUAL(res, 0);
BOOST_CHECK_EQUAL(optLen, existingOptLen - (origECSOptionStr.size() + 4));
responseLen -= (existingOptLen - optLen);
pw.addOpt(512, 0, 0, opts);
pw.commit();
- char * optStart = NULL;
+ uint16_t optStart;
size_t optLen = 0;
bool last = false;
- int res = locateEDNSOptRR((char *) response.data(), response.size(), &optStart, &optLen, &last);
+ int res = locateEDNSOptRR(std::string((char *) response.data(), response.size()), &optStart, &optLen, &last);
BOOST_CHECK_EQUAL(res, 0);
BOOST_CHECK_EQUAL(last, true);
size_t responseLen = response.size();
size_t existingOptLen = optLen;
BOOST_CHECK(existingOptLen < responseLen);
- res = removeEDNSOptionFromOPT(optStart, &optLen, EDNSOptionCode::ECS);
+ res = removeEDNSOptionFromOPT(reinterpret_cast<char *>(response.data()) + optStart, &optLen, EDNSOptionCode::ECS);
BOOST_CHECK_EQUAL(res, 0);
BOOST_CHECK_EQUAL(optLen, existingOptLen - (origECSOptionStr.size() + 4));
responseLen -= (existingOptLen - optLen);
pw.addOpt(512, 0, 0, opts);
pw.commit();
- char * optStart = NULL;
+ uint16_t optStart;
size_t optLen = 0;
bool last = false;
- int res = locateEDNSOptRR((char *) response.data(), response.size(), &optStart, &optLen, &last);
+ int res = locateEDNSOptRR(std::string((char *) response.data(), response.size()), &optStart, &optLen, &last);
BOOST_CHECK_EQUAL(res, 0);
BOOST_CHECK_EQUAL(last, true);
size_t responseLen = response.size();
size_t existingOptLen = optLen;
BOOST_CHECK(existingOptLen < responseLen);
- res = removeEDNSOptionFromOPT(optStart, &optLen, EDNSOptionCode::ECS);
+ res = removeEDNSOptionFromOPT(reinterpret_cast<char *>(response.data()) + optStart, &optLen, EDNSOptionCode::ECS);
BOOST_CHECK_EQUAL(res, 0);
BOOST_CHECK_EQUAL(optLen, existingOptLen - (origECSOptionStr.size() + 4));
responseLen -= (existingOptLen - optLen);
pw.addOpt(512, 0, 0, opts);
pw.commit();
- char * optStart = NULL;
+ uint16_t optStart;
size_t optLen = 0;
bool last = false;
- int res = locateEDNSOptRR((char *) response.data(), response.size(), &optStart, &optLen, &last);
+ int res = locateEDNSOptRR(std::string((char *) response.data(), response.size()), &optStart, &optLen, &last);
BOOST_CHECK_EQUAL(res, 0);
BOOST_CHECK_EQUAL(last, true);
size_t responseLen = response.size();
size_t existingOptLen = optLen;
BOOST_CHECK(existingOptLen < responseLen);
- res = removeEDNSOptionFromOPT(optStart, &optLen, EDNSOptionCode::ECS);
+ res = removeEDNSOptionFromOPT(reinterpret_cast<char *>(response.data()) + optStart, &optLen, EDNSOptionCode::ECS);
BOOST_CHECK_EQUAL(res, 0);
BOOST_CHECK_EQUAL(optLen, existingOptLen - (origECSOptionStr.size() + 4));
responseLen -= (existingOptLen - optLen);
pw.commit();
vector<uint8_t> newResponse;
- int res = rewriteResponseWithoutEDNSOption((const char *) response.data(), response.size(), EDNSOptionCode::ECS, newResponse);
+ int res = rewriteResponseWithoutEDNSOption(std::string((const char *) response.data(), response.size()), EDNSOptionCode::ECS, newResponse);
BOOST_CHECK_EQUAL(res, 0);
BOOST_CHECK_EQUAL(newResponse.size(), response.size() - (origECSOptionStr.size() + 4));
pw.commit();
vector<uint8_t> newResponse;
- int res = rewriteResponseWithoutEDNSOption((const char *) response.data(), response.size(), EDNSOptionCode::ECS, newResponse);
+ int res = rewriteResponseWithoutEDNSOption(std::string((const char *) response.data(), response.size()), EDNSOptionCode::ECS, newResponse);
BOOST_CHECK_EQUAL(res, 0);
BOOST_CHECK_EQUAL(newResponse.size(), response.size() - (origECSOptionStr.size() + 4));
pw.commit();
vector<uint8_t> newResponse;
- int res = rewriteResponseWithoutEDNSOption((const char *) response.data(), response.size(), EDNSOptionCode::ECS, newResponse);
+ int res = rewriteResponseWithoutEDNSOption(std::string((const char *) response.data(), response.size()), EDNSOptionCode::ECS, newResponse);
BOOST_CHECK_EQUAL(res, 0);
BOOST_CHECK_EQUAL(newResponse.size(), response.size() - (origECSOptionStr.size() + 4));
pw.commit();
vector<uint8_t> newResponse;
- int res = rewriteResponseWithoutEDNSOption((const char *) response.data(), response.size(), EDNSOptionCode::ECS, newResponse);
+ int res = rewriteResponseWithoutEDNSOption(std::string((const char *) response.data(), response.size()), EDNSOptionCode::ECS, newResponse);
BOOST_CHECK_EQUAL(res, 0);
BOOST_CHECK_EQUAL(newResponse.size(), response.size() - (origECSOptionStr.size() + 4));