From: Russ Combs (rucombs) Date: Fri, 15 Mar 2019 01:05:36 +0000 (-0400) Subject: Merge pull request #1551 in SNORT/snort3 from ~RUCOMBS/snort3:mem_patch to master X-Git-Tag: 3.0.0-251~18 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d0e7c8685f02c31239749051527f5c070e49b84e;p=thirdparty%2Fsnort3.git Merge pull request #1551 in SNORT/snort3 from ~RUCOMBS/snort3:mem_patch to master Squashed commit of the following: commit 26fa24b06bd1cb55b6aef483acb5be9f09f72d39 Author: russ Date: Thu Mar 14 18:53:23 2019 -0400 memory: remove useless thread local commit 5e3460332ef06117b951ed7173d052afc68fe48a Author: russ Date: Thu Mar 14 17:56:15 2019 -0400 memory: do not re-enter the pruner -- prevent allocations when pruning flow for memory -- detect re-entrancy and exit as a failsafe --- diff --git a/src/flow/flow.cc b/src/flow/flow.cc index 54854ebd1..34d01e379 100644 --- a/src/flow/flow.cc +++ b/src/flow/flow.cc @@ -155,15 +155,19 @@ inline void Flow::clean() void Flow::reset(bool do_cleanup) { - DetectionEngine::onload(this); - DetectionEngine::set_next_packet(); - DetectionEngine de; - if ( session ) { + DetectionEngine::onload(this); + if ( do_cleanup ) + { + DetectionEngine::set_next_packet(); + DetectionEngine de; + session->cleanup(); + de.get_context()->clear_callbacks(); + } else session->clear(); } @@ -200,8 +204,6 @@ void Flow::reset(bool do_cleanup) constexpr size_t offset = offsetof(Flow, flow_data); // FIXIT-L need a struct to zero here to make future proof memset((uint8_t*)this+offset, 0, sizeof(Flow)-offset); - - de.get_context()->clear_callbacks(); } void Flow::restart(bool dump_flow_data) diff --git a/src/memory/memory_cap.cc b/src/memory/memory_cap.cc index dcc18cbc3..4dc4bb00c 100644 --- a/src/memory/memory_cap.cc +++ b/src/memory/memory_cap.cc @@ -72,7 +72,7 @@ struct Tracker } }; -static THREAD_LOCAL Tracker s_tracker; +static Tracker s_tracker; // ----------------------------------------------------------------------------- // helpers @@ -132,7 +132,17 @@ bool MemoryCap::free_space(size_t n) if ( !thread_cap ) return true; - return memory::free_space(n, thread_cap, s_tracker, prune_handler); + static bool entered = false; + assert(!entered); + + if ( entered ) + return false; + + entered = true; + bool avail = memory::free_space(n, thread_cap, s_tracker, prune_handler); + entered = false; + + return avail; } static size_t fudge_it(size_t n)