]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
Pull request #3309: stream: reusable stream splitter
authorTom Peters (thopeter) <thopeter@cisco.com>
Fri, 18 Mar 2022 20:54:21 +0000 (20:54 +0000)
committerTom Peters (thopeter) <thopeter@cisco.com>
Fri, 18 Mar 2022 20:54:21 +0000 (20:54 +0000)
Merge in SNORT/snort3 from ~THOPETER/snort3:reusable_splitter to master

Squashed commit of the following:

commit f46c56042a28b94d8a3c48ac88eaa0cbb2f72ed9
Author: Tom Peters <thopeter@cisco.com>
Date:   Tue Mar 15 15:53:46 2022 -0400

    stream: reusable stream splitter

src/service_inspectors/http2_inspect/http2_flow_data.cc
src/service_inspectors/http2_inspect/http2_inspect.h
src/service_inspectors/http2_inspect/http2_stream_splitter.h
src/service_inspectors/http_inspect/http_inspect.h
src/service_inspectors/http_inspect/http_stream_splitter.h
src/stream/stream_splitter.h
src/stream/tcp/tcp_stream_tracker.cc
src/stream/user/user_session.cc

index 5cac7196d5b7ca174753c4a3dbfddebb9bc89bfd..c34e5e72a5b8d25dda483b970e618fbb5b80b091 100644 (file)
@@ -91,7 +91,7 @@ Http2FlowData::~Http2FlowData()
     {
         delete infractions[k];
         delete events[k];
-        delete hi_ss[k];
+        hi_ss[k]->go_away();
         delete[] frame_data[k];
     }
 
index 4fe12f5d1a8d4de7db8599fcf81b0ca6e60573f5..d803c982d7a8aba91c957ae48458d373f9be9d4d 100644 (file)
@@ -50,7 +50,7 @@ public:
     void clear(snort::Packet* p) override;
 
     Http2StreamSplitter* get_splitter(bool is_client_to_server) override
-    { return new Http2StreamSplitter(is_client_to_server); }
+    { return &splitter[is_client_to_server ? HttpCommon::SRC_CLIENT : HttpCommon::SRC_SERVER]; }
 
     bool can_carve_files() const override
     { return true; }
@@ -58,6 +58,8 @@ public:
 private:
     friend Http2Api;
 
+    Http2StreamSplitter splitter[2] = { true, false };
+
     const Http2ParaList* const params;
 };
 
index dc6a7848cddad5bb1f9d32b88ca2c1fbc34c8451..1b9b37e152a672c968644b8b1d04e1696e49998a 100644 (file)
@@ -44,6 +44,7 @@ public:
 
     // FIXIT-M should return actual packet buffer size
     unsigned max(snort::Flow*) override { return Http2Enums::MAX_OCTETS; }
+    void go_away() override {}
 
 private:
     const HttpCommon::SourceId source_id;
index 44021533a30fad79642ab01c2405ea0fe37f0c11..436a522a18894fbb678734731d4e86bd4f6cf9e3 100644 (file)
@@ -62,7 +62,7 @@ public:
     void clear(snort::Packet* p) override;
 
     HttpStreamSplitter* get_splitter(bool is_client_to_server) override
-    { return new HttpStreamSplitter(is_client_to_server, this); }
+    { return &splitter[is_client_to_server ? HttpCommon::SRC_CLIENT : HttpCommon::SRC_SERVER]; }
 
     bool can_carve_files() const override
     { return true; }
@@ -84,6 +84,8 @@ private:
     friend HttpApi;
     friend HttpStreamSplitter;
 
+    HttpStreamSplitter splitter[2] = { { true, this }, { false, this } };
+
     bool process(const uint8_t* data, const uint16_t dsize, snort::Flow* const flow,
         HttpCommon::SourceId source_id_, bool buf_owner) const;
     static HttpFlowData* http_get_flow_data(const snort::Flow* flow);
index 0f6781a8eb65bc9e3dc634cf3763f669c58221bb..b9ea3ad7d225425fa2559fd40b93276caf08c2e0 100644 (file)
@@ -49,6 +49,7 @@ public:
 
     // FIXIT-M should return actual packet buffer size
     unsigned max(snort::Flow*) override { return HttpEnums::MAX_OCTETS; }
+    void go_away() override {}
 
 private:
     void prepare_flush(HttpFlowData* session_data, uint32_t* flush_offset, HttpEnums::SectionType
index 4d109758c4eca7949a567c162b8187cf9590de96..387cb252bd3bd7f4b5a04bd1bdc4d0ca35ecfbc4 100644 (file)
@@ -82,6 +82,7 @@ public:
 
     virtual bool is_paf() { return false; }
     virtual unsigned max(Flow* = nullptr);
+    virtual void go_away() { delete this; }
 
     bool to_server() { return c2s; }
     bool to_client() { return !c2s; }
index 2188082f6679d965451c06d3b58ab63aba1a6f58..5428393a43a00dab000c3fce5984cc637bd36eea 100644 (file)
@@ -71,7 +71,7 @@ TcpStreamTracker::TcpStreamTracker(bool client) :
 { }
 
 TcpStreamTracker::~TcpStreamTracker()
-{ delete splitter; }
+{ if (splitter != nullptr) splitter->go_away(); }
 
 TcpStreamTracker::TcpEvent TcpStreamTracker::set_tcp_event(const TcpSegmentDescriptor& tsd)
 {
@@ -255,7 +255,7 @@ void TcpStreamTracker::init_flush_policy()
 void TcpStreamTracker::set_splitter(StreamSplitter* ss)
 {
     if ( splitter )
-        delete splitter;
+        splitter->go_away();
 
     splitter = ss;
 
index 33fa05563f2f8430bc05f5a3be23fdeafcefedad..b08f0697ac16c9986164166f025355b0dd4ed0f8 100644 (file)
@@ -138,7 +138,7 @@ void UserTracker::term()
 {
     if ( splitter )
     {
-        delete splitter;
+        splitter->go_away();
         splitter = nullptr;
     }
 
@@ -367,8 +367,10 @@ void UserSession::start(Packet* p, Flow* f)
 
 void UserSession::end(Packet*, Flow*)
 {
-    delete client.splitter;
-    delete server.splitter;
+    if (client.splitter != nullptr)
+        client.splitter->go_away();
+    if (server.splitter != nullptr)
+        server.splitter->go_away();
 
     client.splitter = nullptr;
     server.splitter = nullptr;
@@ -451,7 +453,7 @@ void UserSession::set_splitter(bool c2s, StreamSplitter* ss)
     UserTracker& ut = c2s ? server : client;
 
     if ( ut.splitter )
-        delete ut.splitter;
+        ut.splitter->go_away();
 
     ut.splitter = ss;