mirror of
https://github.com/zeek/zeek.git
synced 2025-10-16 13:38:19 +00:00
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:
parent
7799a86a7f
commit
eef432561e
1 changed files with 22 additions and 16 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue