From 62de5678f7532fb4c31bd7dce481491f5d11128a Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Wed, 4 Sep 2013 16:47:44 -0500 Subject: [PATCH] Fix memory leak in DNS TXT lookups. --- src/DNS_Mgr.cc | 12 +++++++- testing/btest/core/leaks/dns-txt.bro | 43 ++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 testing/btest/core/leaks/dns-txt.bro diff --git a/src/DNS_Mgr.cc b/src/DNS_Mgr.cc index 4596a7d73a..2005202484 100644 --- a/src/DNS_Mgr.cc +++ b/src/DNS_Mgr.cc @@ -713,6 +713,16 @@ void DNS_Mgr::AddResult(DNS_Mgr_Request* dr, struct nb_dns_result* r) TextMap::iterator it = text_mappings.find(dr->ReqHost()); if ( it == text_mappings.end() ) text_mappings[dr->ReqHost()] = new_dm; + else + { + if ( new_dm->Failed() && prev_dm && prev_dm->Valid() ) + ++keep_prev; + else + { + prev_dm = it->second; + it->second = new_dm; + } + } } else { @@ -766,7 +776,7 @@ void DNS_Mgr::AddResult(DNS_Mgr_Request* dr, struct nb_dns_result* r) } } - if ( prev_dm ) + if ( prev_dm && ! dr->ReqIsTxt() ) CompareMappings(prev_dm, new_dm); if ( keep_prev ) diff --git a/testing/btest/core/leaks/dns-txt.bro b/testing/btest/core/leaks/dns-txt.bro new file mode 100644 index 0000000000..44b7c04a0c --- /dev/null +++ b/testing/btest/core/leaks/dns-txt.bro @@ -0,0 +1,43 @@ +# Needs perftools support. +# +# @TEST-GROUP: leaks +# +# @TEST-REQUIRES: bro --help 2>&1 | grep -q mem-leaks +# +# @TEST-EXEC: HEAP_CHECK_DUMP_DIRECTORY=. HEAPCHECK=local btest-bg-run bro bro -b -m -r $TRACES/wikipedia.trace %INPUT +# @TEST-EXEC: btest-bg-wait 15 + +@load base/frameworks/communication # keep network time running +redef exit_only_after_terminate = T; + +global n1 = 0; + +function check_term_conditions() + { + if ( n1 > 7 ) + terminate(); + } + + +event do_txt(s: string) + { + when ( local t1 = lookup_hostname_txt(s) ) + { + print "t1", t1; + ++n1; + check_term_conditions(); + } + timeout 100secs + { + print "t1 timeout"; + ++n1; + check_term_conditions(); + } + } + +event connection_established(c: connection) + { + event do_txt("localhost"); + schedule 5sec { do_txt("localhost") }; + } +