]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
Merge pull request #1551 in SNORT/snort3 from ~RUCOMBS/snort3:mem_patch to master
authorRuss Combs (rucombs) <rucombs@cisco.com>
Fri, 15 Mar 2019 01:05:36 +0000 (21:05 -0400)
committerRuss Combs (rucombs) <rucombs@cisco.com>
Fri, 15 Mar 2019 01:05:36 +0000 (21:05 -0400)
Squashed commit of the following:

commit 26fa24b06bd1cb55b6aef483acb5be9f09f72d39
Author: russ <rucombs@cisco.com>
Date:   Thu Mar 14 18:53:23 2019 -0400

    memory: remove useless thread local

commit 5e3460332ef06117b951ed7173d052afc68fe48a
Author: russ <rucombs@cisco.com>
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

src/flow/flow.cc
src/memory/memory_cap.cc

index 54854ebd12912b6f6ee9d93fb8fa96f0bc76f847..34d01e37985ee70df8f7b57d1195a5790209a5b1 100644 (file)
@@ -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)
index dcc18cbc33624a484693c5dadd6948b306e80ffa..4dc4bb00c8a875479a9e8059571f4b0c22254d56 100644 (file)
@@ -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)