}
}
-static string makeLoginfo(const DNSComboWriter* dc)
+static string makeLoginfo(const std::unique_ptr<DNSComboWriter>& dc)
try
{
return "("+dc->d_mdp.d_qname.toLogString()+"/"+DNSRecordContent::NumberToType(dc->d_mdp.d_qtype)+" from "+(dc->getRemote())+")";
static void startDoResolve(void *p)
{
- DNSComboWriter* dc=(DNSComboWriter *)p;
+ auto dc=std::unique_ptr<DNSComboWriter>(reinterpret_cast<DNSComboWriter*>(p));
try {
if (t_queryring)
t_queryring->push_back(make_pair(dc->d_mdp.d_qname, dc->d_mdp.d_qtype));
case DNSFilterEngine::PolicyKind::Drop:
g_stats.policyDrops++;
g_stats.policyResults[appliedPolicy.d_kind]++;
- delete dc;
- dc=0;
return;
case DNSFilterEngine::PolicyKind::NXDOMAIN:
g_stats.policyResults[appliedPolicy.d_kind]++;
throw PDNSException("NoAction policy returned while a NSDNAME or NSIP trigger was hit");
case DNSFilterEngine::PolicyKind::Drop:
g_stats.policyDrops++;
- delete dc;
- dc=0;
return;
case DNSFilterEngine::PolicyKind::NXDOMAIN:
ret.clear();
break;
case DNSFilterEngine::PolicyKind::Drop:
g_stats.policyDrops++;
- delete dc;
- dc=0;
return;
case DNSFilterEngine::PolicyKind::NXDOMAIN:
ret.clear();
haveAnswer:;
if(res == PolicyDecision::DROP) {
g_stats.policyDrops++;
- delete dc;
- dc=0;
return;
}
if(tracedQuery || res == -1 || res == RCode::ServFail || pw.getHeader()->rcode == RCode::ServFail)
g_stats.avgLatencyOursUsec=(1-1.0/g_latencyStatSize)*g_stats.avgLatencyOursUsec + (float)newLat/g_latencyStatSize;
}
// cout<<dc->d_mdp.d_qname<<"\t"<<MT->getUsec()<<"\t"<<sr.d_outqueries<<endl;
- delete dc;
- dc=0;
}
catch(PDNSException &ae) {
g_log<<Logger::Error<<"startDoResolve problem "<<makeLoginfo(dc)<<": "<<ae.reason<<endl;
- delete dc;
}
catch(const MOADNSException &mde) {
g_log<<Logger::Error<<"DNS parser error "<<makeLoginfo(dc) <<": "<<dc->d_mdp.d_qname<<", "<<mde.what()<<endl;
- delete dc;
}
catch(std::exception& e) {
g_log<<Logger::Error<<"STL error "<< makeLoginfo(dc)<<": "<<e.what();
} catch(...) {}
g_log<<endl;
- delete dc;
}
catch(...) {
g_log<<Logger::Error<<"Any other exception in a resolver context "<< makeLoginfo(dc) <<endl;
- delete dc;
}
g_stats.maxMThreadStackUsage = max(MT->getMaxStackUsage(), g_stats.maxMThreadStackUsage);
if(conn->bytesread==conn->qlen) {
t_fdm->removeReadFD(fd); // should no longer awake ourselves when there is data to read
- DNSComboWriter* dc=nullptr;
+ std::unique_ptr<DNSComboWriter> dc;
try {
- dc=new DNSComboWriter(conn->data, g_now);
+ dc=std::unique_ptr<DNSComboWriter>(new DNSComboWriter(conn->data, g_now));
}
catch(const MOADNSException &mde) {
g_stats.clientParseError++;
if(g_logCommonErrors) {
g_log<<Logger::Error<<"Ignoring answer from TCP client "<< dc->getRemote() <<" on server socket!"<<endl;
}
- delete dc;
return;
}
if(dc->d_mdp.d_header.opcode) {
if(g_logCommonErrors) {
g_log<<Logger::Error<<"Ignoring non-query opcode from TCP client "<< dc->getRemote() <<" on server socket!"<<endl;
}
- delete dc;
return;
}
else if (dh->qdcount == 0) {
if(g_logCommonErrors) {
g_log<<Logger::Error<<"Ignoring empty (qdcount == 0) query from "<< dc->getRemote() <<" on server socket!"<<endl;
}
- delete dc;
return;
}
else {
++g_stats.qcounter;
++g_stats.tcpqcounter;
- MT->makeThread(startDoResolve, dc); // deletes dc, will set state to BYTE0 again
+ MT->makeThread(startDoResolve, dc.release()); // deletes dc, will set state to BYTE0 again
return;
}
}
return 0;
}
- DNSComboWriter* dc = new DNSComboWriter(question, g_now, std::move(policyTags), std::move(data));
+ auto dc = std::unique_ptr<DNSComboWriter>(new DNSComboWriter(question, g_now, std::move(policyTags), std::move(data)));
dc->setSocket(fd);
dc->d_tag=ctag;
dc->d_qhash=qhash;
dc->d_deviceId = deviceId;
#endif
- MT->makeThread(startDoResolve, (void*) dc); // deletes dc
+ MT->makeThread(startDoResolve, (void*) dc.release()); // deletes dc
return 0;
}