From: davis mcpherson Date: Mon, 18 Apr 2016 18:34:51 +0000 (-0400) Subject: don't delete splitters in session cleanup unless we are doing a full session reset X-Git-Tag: 3.0.0-233~444^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d2e7841eefd8a448b9f442389062cd7ff2dd20ad;p=thirdparty%2Fsnort3.git don't delete splitters in session cleanup unless we are doing a full session reset --- diff --git a/src/stream/libtcp/tcp_stream_session.cc b/src/stream/libtcp/tcp_stream_session.cc index 7efb1cca4..e4abebe25 100644 --- a/src/stream/libtcp/tcp_stream_session.cc +++ b/src/stream/libtcp/tcp_stream_session.cc @@ -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; } diff --git a/src/stream/libtcp/tcp_stream_tracker.h b/src/stream/libtcp/tcp_stream_tracker.h index 37d028a94..633ee2e4b 100644 --- a/src/stream/libtcp/tcp_stream_tracker.h +++ b/src/stream/libtcp/tcp_stream_tracker.h @@ -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; diff --git a/src/stream/tcp/tcp_session.cc b/src/stream/tcp/tcp_session.cc index 204eb1309..b94a1f615 100644 --- a/src/stream/tcp/tcp_session.cc +++ b/src/stream/tcp/tcp_session.cc @@ -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); diff --git a/src/stream/tcp/tcp_tracker.cc b/src/stream/tcp/tcp_tracker.cc index d44ffcb71..6b794a7bc 100644 --- a/src/stream/tcp/tcp_tracker.cc +++ b/src/stream/tcp/tcp_tracker.cc @@ -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); diff --git a/src/stream/tcp/tcp_tracker.h b/src/stream/tcp/tcp_tracker.h index a0999339e..842996d0a 100644 --- a/src/stream/tcp/tcp_tracker.h +++ b/src/stream/tcp/tcp_tracker.h @@ -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;