}
if (!d_dontAge && !skipAging) {
- ageDNSPacket(reinterpret_cast<char *>(&response[0]), response.size(), age);
+ if (!stale) {
+ ageDNSPacket(reinterpret_cast<char *>(&response[0]), response.size(), age);
+ }
+ else {
+ editDNSPacketTTL(reinterpret_cast<char *>(&response[0]), response.size(),
+ [staleTTL = d_staleTTL](uint8_t section, uint16_t class_, uint16_t type, uint32_t ttl) { return staleTTL; });
+ }
}
d_hits++;
uint32_t tmp;
memcpy(&tmp, (void*) p, sizeof(tmp));
tmp = ntohl(tmp);
- tmp-=decrease;
+ if (tmp > decrease) {
+ tmp -= decrease;
+ } else {
+ tmp = 0;
+ }
tmp = htonl(tmp);
memcpy(d_packet + d_offset-4, (const char*)&tmp, sizeof(tmp));
}
g_stats.variableResponses++;
}
if (!SyncRes::s_nopacketcache && !variableAnswer && !sr.wasVariable()) {
+ minTTL = min(minTTL, pw.getHeader()->rcode == RCode::ServFail ? SyncRes::s_packetcacheservfailttl :
+ SyncRes::s_packetcachettl);
t_packetCache->insertResponsePacket(dc->d_tag, dc->d_qhash, std::move(dc->d_query), dc->d_mdp.d_qname,
dc->d_mdp.d_qtype, dc->d_mdp.d_qclass,
string((const char*)&*packet.begin(), packet.size()),
g_now.tv_sec,
- pw.getHeader()->rcode == RCode::ServFail ? SyncRes::s_packetcacheservfailttl :
- min(minTTL,SyncRes::s_packetcachettl),
+ minTTL,
dq.validationState,
std::move(pbDataForCache), dc->d_tcp);
}
BOOST_CHECK(firstPacket == expectedAlteredPacket);
- /* now remove more than the remaining TTL, not that while TTL are,
- per rfc1035 errata, "a 32 bit unsigned integer" so we should be
- able to expect unsigned overflow to apply, but rfc2181 specifies
- a maximum of "2^31 - 1". */
+ /* now remove more than the remaining TTL. We expect ageDNSPacket
+ to cap this at zero and not cause an unsigned underflow into
+ the 2^32-1 neighbourhood */
ageDNSPacket(reinterpret_cast<char*>(firstPacket.data()), firstPacket.size(), 1801);
- uint32_t ttl = std::numeric_limits<uint32_t>::max();
+ uint32_t ttl = 0;
expectedAlteredPacket = generatePacket(ttl);
BOOST_REQUIRE_EQUAL(firstPacket.size(), expectedAlteredPacket.size());