From: Michael Altizer (mialtize) Date: Wed, 13 Nov 2019 00:04:27 +0000 (-0500) Subject: Merge pull request #1836 in SNORT/snort3 from ~DAVMCPHE/snort3:stream_tcp_tsm_tsan_pa... X-Git-Tag: 3.0.0-265~11 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a2ca6d538dd4728dce05fb4579f205ce61304e7c;p=thirdparty%2Fsnort3.git Merge pull request #1836 in SNORT/snort3 from ~DAVMCPHE/snort3:stream_tcp_tsm_tsan_patch to master Squashed commit of the following: commit bc8abc4b89ad76dbf294cc5e09c4d643d19607d8 Author: davis mcpherson Date: Wed Nov 6 11:40:38 2019 -0500 stream_tcp: initialize tcp state machine instance in the stream_tcp plugin init method to ensure it is created before the packet threads are started. in addition the state machine is deleted in the stream_tcp plugin term method to free up allocated memory before snort exits. --- diff --git a/src/stream/libtcp/tcp_state_machine.cc b/src/stream/libtcp/tcp_state_machine.cc index a8bbdd653..43943617f 100644 --- a/src/stream/libtcp/tcp_state_machine.cc +++ b/src/stream/libtcp/tcp_state_machine.cc @@ -40,7 +40,7 @@ TcpStateMachine::~TcpStateMachine() void TcpStateMachine::register_state_handler(TcpStreamTracker::TcpState state, TcpStateHandler& handler) { - delete tcp_state_handlers[ state ]; + assert( !tcp_state_handlers[ state ]); tcp_state_handlers[ state ] = &handler; } diff --git a/src/stream/libtcp/tcp_state_machine.h b/src/stream/libtcp/tcp_state_machine.h index 9812dabfc..d32ceb944 100644 --- a/src/stream/libtcp/tcp_state_machine.h +++ b/src/stream/libtcp/tcp_state_machine.h @@ -16,7 +16,7 @@ // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. //-------------------------------------------------------------------------- -// tcp_state_machine.h author davis mcpherson +// tcp_state_machine.h author davis mcpherson // Created on: Jul 29, 2015 #ifndef TCP_STATE_MACHINE_H diff --git a/src/stream/tcp/stream_tcp.cc b/src/stream/tcp/stream_tcp.cc index 8dedb1960..847b33ec5 100644 --- a/src/stream/tcp/stream_tcp.cc +++ b/src/stream/tcp/stream_tcp.cc @@ -27,6 +27,7 @@ #include "tcp_ha.h" #include "tcp_module.h" #include "tcp_session.h" +#include "tcp_stream_state_machine.h" using namespace snort; @@ -42,7 +43,6 @@ public: void show(SnortConfig*) override; bool configure(SnortConfig*) override; - void tinit() override; void tterm() override; @@ -55,14 +55,10 @@ public: StreamTcp::StreamTcp (TcpStreamConfig* c) : config(c) {} StreamTcp::~StreamTcp() -{ - delete config; -} +{ delete config; } void StreamTcp::show(SnortConfig*) -{ - TcpStreamConfig::show_config(config); -} +{ TcpStreamConfig::show_config(config); } bool StreamTcp::configure(SnortConfig* sc) { @@ -111,14 +107,16 @@ static Inspector* tcp_ctor(Module* m) } static void tcp_dtor(Inspector* p) -{ - delete p; -} +{ delete p; } + +static void stream_tcp_pinit() +{ TcpStreamStateMachine::initialize(); } + +static void stream_tcp_pterm() +{ TcpStreamStateMachine::finalize(); } static Session* tcp_ssn(Flow* lws) -{ - return new TcpSession(lws); -} +{ return new TcpSession(lws); } static const InspectApi tcp_api = { @@ -138,8 +136,8 @@ static const InspectApi tcp_api = PROTO_BIT__TCP, nullptr, // buffers nullptr, // service - nullptr, // init - nullptr, // term + stream_tcp_pinit, // pinit + stream_tcp_pterm, // pterm nullptr, // tinit, nullptr, // tterm, tcp_ctor, diff --git a/src/stream/tcp/tcp_stream_state_machine.cc b/src/stream/tcp/tcp_stream_state_machine.cc index b4b652877..cd87ba076 100644 --- a/src/stream/tcp/tcp_stream_state_machine.cc +++ b/src/stream/tcp/tcp_stream_state_machine.cc @@ -16,7 +16,7 @@ // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. //-------------------------------------------------------------------------- -// tcp_stream_state_machine.cc author davis mcpherson +// tcp_stream_state_machine.cc author davis mcpherson // Created on: Apr 1, 2016 #ifdef HAVE_CONFIG_H @@ -38,6 +38,21 @@ #include "tcp_state_last_ack.h" #include "tcp_state_time_wait.h" +TcpStreamStateMachine* TcpStreamStateMachine::tsm = nullptr; + +TcpStateMachine* TcpStreamStateMachine::initialize() +{ + assert(!tsm); + TcpStreamStateMachine::tsm = new TcpStreamStateMachine(); + return TcpStreamStateMachine::tsm; +} + +void TcpStreamStateMachine::finalize() +{ + delete TcpStreamStateMachine::tsm; + TcpStreamStateMachine::tsm = nullptr; +} + TcpStreamStateMachine::TcpStreamStateMachine() { // initialize stream tracker state machine with handler for each state... @@ -54,4 +69,3 @@ TcpStreamStateMachine::TcpStreamStateMachine() new TcpStateLastAck(*this); new TcpStateTimeWait(*this); } - diff --git a/src/stream/tcp/tcp_stream_state_machine.h b/src/stream/tcp/tcp_stream_state_machine.h index 45ccda06c..40dacb8d1 100644 --- a/src/stream/tcp/tcp_stream_state_machine.h +++ b/src/stream/tcp/tcp_stream_state_machine.h @@ -16,7 +16,7 @@ // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. //-------------------------------------------------------------------------- -// tcp_stream_state_machine.h author davis mcpherson +// tcp_stream_state_machine.h author davis mcpherson // Created on: Apr 1, 2016 #ifndef TCP_STREAM_STATE_MACHINE_H @@ -27,14 +27,17 @@ class TcpStreamStateMachine: public TcpStateMachine { public: - static TcpStateMachine* get_instance( ) - { - static TcpStreamStateMachine tsm; - return &tsm; - } + static TcpStateMachine* initialize(); + static void finalize(); + + static TcpStateMachine* get_instance() + { return TcpStreamStateMachine::tsm; } private: TcpStreamStateMachine(); + + static TcpStreamStateMachine* tsm; + }; #endif