// method of operation: silently fail if it doesn't work - we're only trying to be nice, don't fall over on it
void ageDNSPacket(std::string& packet, uint32_t seconds)
{
- if(packet.length() < 12)
+ if(packet.length() < sizeof(dnsheader))
return;
try
{
- const dnsheader* dh = (const dnsheader*)packet.c_str();
- int numrecords = ntohs(dh->ancount) + ntohs(dh->nscount) + ntohs(dh->arcount);
+ dnsheader dh;
+ memcpy((void*)&dh, (const dnsheader*)packet.c_str(), sizeof(dh));
+ int numrecords = ntohs(dh.ancount) + ntohs(dh.nscount) + ntohs(dh.arcount);
DNSPacketMangler dpm(packet);
int n;
- for(n=0; n < ntohs(dh->qdcount) ; ++n) {
+ for(n=0; n < ntohs(dh.qdcount) ; ++n) {
dpm.skipLabel();
dpm.skipBytes(4); // qtype, qclass
}
uint32_t age;
if(!SyncRes::s_nopacketcache && t_packetCache->getResponsePacket(question, g_now.tv_sec, &response, &age)) {
if(!g_quiet)
- L<<Logger::Error<<t_id<< " question answered from packet cache from "<<fromaddr.toString()<<endl;
+ L<<Logger::Error<<t_id<< " question answered from packet cache from "<<fromaddr.toString()<<endl;
g_stats.packetCacheHits++;
SyncRes::s_queries++;
ageDNSPacket(response, age);
sendto(fd, response.c_str(), response.length(), 0, (struct sockaddr*) &fromaddr, fromaddr.getSocklen());
if(response.length() >= sizeof(struct dnsheader))
- updateRcodeStats(((struct dnsheader*)response.c_str())->rcode);
+ updateRcodeStats(((struct dnsheader*)response.c_str())->rcode);
g_stats.avgLatencyUsec=(uint64_t)((1-0.0001)*g_stats.avgLatencyUsec + 0); // we assume 0 usec
return 0;
}