Fix memory leak if a DNS request fails to be made.

A symptom of this is a "can't issue DNS request" warning in
reporter.log. (Doesn't look like this should be a typical thing
that happens in most environments).
This commit is contained in:
Jon Siwek 2013-09-05 11:52:40 -05:00
parent 7799a86a7f
commit eef432561e

View file

@ -1095,6 +1095,17 @@ void DNS_Mgr::AsyncLookupNameText(string name, LookupCallback* callback)
IssueAsyncRequests(); IssueAsyncRequests();
} }
static bool DoRequest(nb_dns_info* nb_dns, DNS_Mgr_Request* dr)
{
if ( dr->MakeRequest(nb_dns) )
// dr stored in nb_dns cookie and deleted later when results available.
return true;
reporter->Warning("can't issue DNS request");
delete dr;
return false;
}
void DNS_Mgr::IssueAsyncRequests() void DNS_Mgr::IssueAsyncRequests()
{ {
while ( asyncs_queued.size() && asyncs_pending < MAX_PENDING_REQUESTS ) while ( asyncs_queued.size() && asyncs_pending < MAX_PENDING_REQUESTS )
@ -1104,31 +1115,26 @@ void DNS_Mgr::IssueAsyncRequests()
++num_requests; ++num_requests;
DNS_Mgr_Request* dr; bool success;
DNS_Mgr_Request* dr6 = 0;
if ( req->IsAddrReq() ) if ( req->IsAddrReq() )
dr = new DNS_Mgr_Request(req->host); success = DoRequest(nb_dns, new DNS_Mgr_Request(req->host));
else if ( req->is_txt )
success = DoRequest(nb_dns, new DNS_Mgr_Request(req->name.c_str(),
AF_INET, req->is_txt));
else else
{ {
dr = new DNS_Mgr_Request(req->name.c_str(), AF_INET, req->is_txt); // If only one request type succeeds, don't consider it a failure.
if ( ! req->is_txt ) success = DoRequest(nb_dns, new DNS_Mgr_Request(req->name.c_str(),
dr6 = new DNS_Mgr_Request(req->name.c_str(), AF_INET6, req->is_txt); AF_INET, req->is_txt));
success = DoRequest(nb_dns, new DNS_Mgr_Request(req->name.c_str(),
AF_INET6, req->is_txt)) || success;
} }
if ( ! dr->MakeRequest(nb_dns) ) if ( ! success )
{ {
reporter->Warning("can't issue DNS request");
++failed;
req->Timeout(); req->Timeout();
continue;
}
if ( dr6 && ! dr6->MakeRequest(nb_dns) )
{
reporter->Warning("can't issue DNS request");
++failed; ++failed;
req->Timeout();
continue; continue;
} }