diff --git a/CHANGES b/CHANGES index 8d9a07fd40..4a60a0bede 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,12 @@ +2.5-897 | 2018-08-23 15:53:16 +0000 + + * BIT-1885: Fix input framework memory leak. For input threads that + get joined during run-time, messages could remain in the thread's + queue and leak. (Jon Siwek, Corelight) + + * Increase timeout for a memleak test. (Jon Siwek, Corelight) + 2.5-894 | 2018-08-22 12:05:19 -0500 * Ensure external test repo hashes track origin/master (Jon Siwek, Corelight) diff --git a/VERSION b/VERSION index f035f856e3..18f5be6a90 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.5-894 +2.5-897 diff --git a/src/threading/Manager.cc b/src/threading/Manager.cc index 449f2a8ad1..b07ab0d3d5 100644 --- a/src/threading/Manager.cc +++ b/src/threading/Manager.cc @@ -160,6 +160,7 @@ void Manager::Process() for ( all_thread_list::iterator i = to_delete.begin(); i != to_delete.end(); i++ ) { BasicThread* t = *i; + t->WaitForStop(); all_threads.remove(t); diff --git a/src/threading/MsgThread.cc b/src/threading/MsgThread.cc index c603f20625..bd16206bb4 100644 --- a/src/threading/MsgThread.cc +++ b/src/threading/MsgThread.cc @@ -21,6 +21,8 @@ public: network_time(network_time) { } virtual bool Process() { + if ( Object()->child_finished ) + return true; bool result = Object()->OnFinish(network_time); Object()->Finished(); return result; @@ -90,7 +92,19 @@ public: KillMeMessage(MsgThread* thread) : OutputMessage("ReporterMessage", thread) {} - virtual bool Process() { thread_mgr->KillThread(Object()); return true; } + virtual bool Process() + { + auto rval = true; + + if ( ! Object()->child_finished ) + { + rval = Object()->OnFinish(network_time); + Object()->Finished(); + } + + thread_mgr->KillThread(Object()); + return rval; + } }; #ifdef DEBUG diff --git a/src/threading/MsgThread.h b/src/threading/MsgThread.h index 60da2d9668..1a5834c021 100644 --- a/src/threading/MsgThread.h +++ b/src/threading/MsgThread.h @@ -181,6 +181,7 @@ protected: friend class HeartbeatMessage; friend class FinishMessage; friend class FinishedMessage; + friend class KillMeMessage; /** * Pops a message sent by the child from the child-to-main queue. diff --git a/testing/btest/core/leaks/input-raw.bro b/testing/btest/core/leaks/input-raw.bro index 1a7315bc2a..608ea25030 100644 --- a/testing/btest/core/leaks/input-raw.bro +++ b/testing/btest/core/leaks/input-raw.bro @@ -6,9 +6,9 @@ # # @TEST-EXEC: cp input1.log input.log # @TEST-EXEC: HEAP_CHECK_DUMP_DIRECTORY=. HEAPCHECK=local btest-bg-run bro bro -m -b %INPUT -# @TEST-EXEC: $SCRIPTS/wait-for-file bro/got2 8 || (btest-bg-wait -k 1 && false) +# @TEST-EXEC: $SCRIPTS/wait-for-file bro/got2 60 || (btest-bg-wait -k 1 && false) # @TEST-EXEC: cat input2.log >> input.log -# @TEST-EXEC: $SCRIPTS/wait-for-file bro/got6 8 || (btest-bg-wait -k 1 && false) +# @TEST-EXEC: $SCRIPTS/wait-for-file bro/got6 15 || (btest-bg-wait -k 1 && false) # @TEST-EXEC: cat input3.log >> input.log # @TEST-EXEC: btest-bg-wait 60