]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
don't delete splitters in session cleanup unless we are doing a full session reset
authordavis mcpherson <davis.mcpherson@gmail.com>
Mon, 18 Apr 2016 18:34:51 +0000 (14:34 -0400)
committerdavis mcpherson <davis.mcpherson@gmail.com>
Mon, 18 Apr 2016 18:34:51 +0000 (14:34 -0400)
src/stream/libtcp/tcp_stream_session.cc
src/stream/libtcp/tcp_stream_tracker.h
src/stream/tcp/tcp_session.cc
src/stream/tcp/tcp_tracker.cc
src/stream/tcp/tcp_tracker.h

index 7efb1cca4a9de50871d5bb9094045d95afbe55f7..e4abebe25274002b7c8cc37448d01a341e2baff5 100644 (file)
@@ -422,6 +422,7 @@ bool TcpStreamSession::setup(Packet*)
     ingress_index = egress_index = 0;
     ingress_group = egress_group = 0;
     daq_flags = address_space_id = 0;
+    config = nullptr;
 
     return true;
 }
index 37d028a94b737028b84a3190b61e2407b817c65f..633ee2e4b15e5a7b2c6afaf038606d12f6f7b682 100644 (file)
@@ -324,6 +324,7 @@ public:
     virtual void init_flush_policy(void) =  0;
     virtual void set_splitter(StreamSplitter* ss) =  0;
     virtual void set_splitter(const Flow* flow) =  0;
+    virtual void reset_splitter( void ) = 0;
 
     virtual void init_on_syn_sent(TcpSegmentDescriptor&) =  0;
     virtual void init_on_syn_recv(TcpSegmentDescriptor&) =  0;
index 204eb1309ca1ee623b4396758876fa9c0f979bc7..b94a1f615dbb4cc94679c0254535d011960393ea 100644 (file)
@@ -198,8 +198,6 @@ void TcpSession::clear_session(int freeApplicationData)
     else if (flow->get_session_flags() & SSNFLAG_TIMEDOUT)
         tcpStats.timeouts++;
 
-    set_splitter(true, nullptr);
-    set_splitter(false, nullptr);
 
     DebugFormat(DEBUG_STREAM_STATE, "In TcpSessionClear, %lu bytes in use\n", tcp_memcap->used());
 
@@ -217,17 +215,25 @@ void TcpSession::clear_session(int freeApplicationData)
         server->reassembler->purge_segment_list();
     }
 
-    paf_clear(&client->paf_state);
-    paf_clear(&server->paf_state);
 
     // update light-weight state
     if ( freeApplicationData == 2 )
+    {
         flow->restart(true);
+
+        // FIXIT - do we need to reset PAF here too?
+        client->reset_splitter();
+        server->reset_splitter();
+    }
     else
     {
         flow->clear(freeApplicationData);
-        config = nullptr;
+        paf_clear(&client->paf_state);
+        paf_clear(&server->paf_state);
+        set_splitter(true, nullptr);
+        set_splitter(false, nullptr);
     }
+
     // generate event for rate filtering
     tel.log_internal_event(INTERNAL_EVENT_SESSION_DEL);
 
index d44ffcb718270ed54b207e547991d8fad9e04975..6b794a7bc138d572327faf01d0a9985fe9cd3ff0 100644 (file)
@@ -103,6 +103,12 @@ void TcpTracker::set_splitter(const Flow* flow)
         set_splitter(new AtomSplitter(!client_tracker) );
 }
 
+void TcpTracker::reset_splitter( void )
+{
+    if ( splitter )
+        splitter->reset();
+}
+
 void TcpTracker::init_on_syn_sent(TcpSegmentDescriptor& tsd)
 {
     Profile profile(s5TcpNewSessPerfStats);
index a0999339e733f7d4cd5e7f8844457a37265514b3..842996d0adcf12da65f0a2f03255a4fa3741e041 100644 (file)
@@ -62,6 +62,7 @@ public:
     void init_flush_policy(void) override;
     void set_splitter(StreamSplitter* ss) override;
     void set_splitter(const Flow* flow) override;
+    void reset_splitter( void ) override;
 
     void init_on_syn_sent(TcpSegmentDescriptor&) override;
     void init_on_syn_recv(TcpSegmentDescriptor&) override;