]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
Merge pull request #2884 in SNORT/snort3 from ~MDAGON/snort3:cleanup to master
authorTom Peters (thopeter) <thopeter@cisco.com>
Fri, 14 May 2021 22:06:26 +0000 (22:06 +0000)
committerTom Peters (thopeter) <thopeter@cisco.com>
Fri, 14 May 2021 22:06:26 +0000 (22:06 +0000)
Squashed commit of the following:

commit c5b9bb50ce47a73a4928b3d4d50c7d97bdee9546
Author: Maya Dagon <mdagon@cisco.com>
Date:   Fri May 7 12:12:53 2021 -0400

    http2_inspect: update state and delete streams after reaching flow
    depth

src/service_inspectors/http2_inspect/http2_stream.cc
src/service_inspectors/http2_inspect/http2_stream.h
src/service_inspectors/http2_inspect/http2_stream_splitter.h
src/service_inspectors/http2_inspect/http2_stream_splitter_impl.cc

index 19aaf27f190376ec1968bb9cd89f84efddf5e681..3ab143105f11bf4500bd16d5dce9c1539a6ce847 100644 (file)
@@ -70,13 +70,9 @@ void Http2Stream::eval_frame(const uint8_t* header_buffer, uint32_t header_len,
     }
 }
 
-void Http2Stream::clear_frame()
+// check if stream is completed, do cleanup if it is
+void Http2Stream::check_and_cleanup_completed()
 {
-    assert(current_frame != nullptr);
-    current_frame->clear();
-    delete current_frame;
-    current_frame = nullptr;
-
     if ((state[SRC_CLIENT] >= STREAM_COMPLETE) && (state[SRC_SERVER] >= STREAM_COMPLETE))
     {
         if (hi_flow_data != nullptr)
@@ -89,6 +85,16 @@ void Http2Stream::clear_frame()
     }
 }
 
+void Http2Stream::clear_frame()
+{
+    assert(current_frame != nullptr);
+    current_frame->clear();
+    delete current_frame;
+    current_frame = nullptr;
+
+    check_and_cleanup_completed();
+}
+
 void Http2Stream::set_state(HttpCommon::SourceId source_id, StreamState new_state)
 {
     assert((STREAM_EXPECT_HEADERS <= new_state) && (new_state <= STREAM_ERROR));
index 241ed5fa7464e75f4afa2b18aeea92b95d34f429..ec0209f288eabda23c3d3a8afc1d25c38b07286c 100644 (file)
@@ -39,6 +39,7 @@ public:
     uint32_t get_stream_id() const { return stream_id; }
     void eval_frame(const uint8_t* header_buffer, uint32_t header_len, const uint8_t* data_buffer,
         uint32_t data_len, HttpCommon::SourceId source_id);
+    void check_and_cleanup_completed();
     void clear_frame();
     const Field& get_buf(unsigned id);
     HttpFlowData* get_hi_flow_data() const { return hi_flow_data; }
index 981caffef7fa27a2b69d75a6102a5e13df08fe8d..38248e4eeb02d7709ca375f71ce0135ef4bf6286 100644 (file)
@@ -60,6 +60,7 @@ private:
         HttpCommon::SourceId source_id);
     static bool read_frame_hdr(Http2FlowData* session_data, const uint8_t* data,
         uint32_t length, HttpCommon::SourceId source_id, uint32_t& data_offset);
+    static void discarded_data_frame_cleanup(Http2FlowData* session_data, HttpCommon::SourceId source_id);
 };
 
 
index 5d6925b104af2d668a5e94f64b8084247b0ef44b..98ab536db3e0e1f516e1a69cd1ccbe224f5a08b9 100644 (file)
@@ -508,8 +508,31 @@ const StreamBuffer Http2StreamSplitter::implement_reassemble(Http2FlowData* sess
             // but don't create pkt_data buffer
             frame_buf.data = (const uint8_t*)"";
         }
+        else
+            discarded_data_frame_cleanup(session_data, source_id);
     }
 
     return frame_buf;
 }
 
+void Http2StreamSplitter::discarded_data_frame_cleanup(Http2FlowData* session_data, HttpCommon::SourceId source_id)
+{
+    Http2Stream* const stream = session_data->find_current_stream(source_id);
+
+    if (!stream || stream->get_state(source_id) == STREAM_ERROR)
+        return;
+
+    if (stream->is_end_stream_on_data_flush(source_id))
+    {
+        if (session_data->concurrent_files > 0)
+            session_data->concurrent_files -= 1;
+        stream->set_state(source_id, STREAM_COMPLETE);
+        stream->check_and_cleanup_completed();
+        if (session_data->delete_stream)
+        {
+            session_data->processing_stream_id = session_data->get_current_stream_id(source_id);
+            session_data->delete_processing_stream();
+            session_data->processing_stream_id = NO_STREAM_ID;
+        }
+    }
+}