]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
Merge pull request #2760 in SNORT/snort3 from ~MASHASAN/snort3:flush_on_fin_recv...
authorMasud Hasan (mashasan) <mashasan@cisco.com>
Fri, 26 Feb 2021 01:31:39 +0000 (01:31 +0000)
committerMasud Hasan (mashasan) <mashasan@cisco.com>
Fri, 26 Feb 2021 01:31:39 +0000 (01:31 +0000)
Squashed commit of the following:

commit 2eab74e332742c3afbffbdcf2f366a90a7bcd0db
Author: Masud Hasan <mashasan@cisco.com>
Date:   Thu Feb 18 22:05:52 2021 -0500

    stream_tcp: Flush queued segments when FIN is received

src/stream/tcp/tcp_state_close_wait.cc
src/stream/tcp/tcp_state_established.cc
src/stream/tcp/tcp_state_fin_wait1.cc
src/stream/tcp/tcp_state_fin_wait2.cc
src/stream/tcp/tcp_state_syn_recv.cc
src/stream/tcp/tcp_state_syn_sent.cc
src/stream/tcp/tcp_state_time_wait.cc
src/stream/tcp/tcp_stream_tracker.cc
src/stream/tcp/tcp_stream_tracker.h

index 43d05c90df03651eb57481c66a9a71d67a522e00..4019536fa7b9ee3b9fc611c702aa0ba5559fb4ad 100644 (file)
@@ -102,8 +102,7 @@ bool TcpStateCloseWait::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& tr
     {
         if ( !flow->two_way_traffic() )
             trk.set_tf_flags(TF_FORCE_FLUSH);
-        if ( tsd.is_data_segment() )
-            trk.session->handle_data_segment(tsd);
+        trk.perform_fin_recv_flush(tsd);
     }
 
     return true;
index 3333787c82766cdfb7fc586ac0cafa4a1fce7e1f..5cc993ba96b12495a6e3840674501a72074b2c58 100644 (file)
@@ -103,8 +103,7 @@ bool TcpStateEstablished::fin_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker&
 bool TcpStateEstablished::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
     trk.update_tracker_ack_recv(tsd);
-    if ( tsd.is_data_segment() )
-         trk.session->handle_data_segment(tsd);
+    trk.perform_fin_recv_flush(tsd);
 
     if ( trk.update_on_fin_recv(tsd) )
     {
index 6866a16d0016b6a7a5725118e72977eb6678a5ea..fd4f517f5cb81e8011efe54d896db6dff5ef820c 100644 (file)
@@ -99,8 +99,7 @@ bool TcpStateFinWait1::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk
         bool is_ack_valid = false;
         if ( check_for_window_slam(tsd, trk, &is_ack_valid) )
         {
-            if ( tsd.is_data_segment() )
-                trk.session->handle_data_segment(tsd);
+            trk.perform_fin_recv_flush(tsd);
 
             if ( !flow->two_way_traffic() )
                 trk.set_tf_flags(TF_FORCE_FLUSH);
index 85843356db4b0ecf9220d5fbb13f0c66295a55bb..368409e86f0f92fda5ba2d8f58da3b00e4cdbea9 100644 (file)
@@ -108,8 +108,7 @@ bool TcpStateFinWait2::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk
     trk.update_tracker_ack_recv(tsd);
     if ( trk.update_on_fin_recv(tsd) )
     {
-        if ( tsd.is_data_segment() )
-            trk.session->handle_data_segment(tsd);
+        trk.perform_fin_recv_flush(tsd);
 
         if ( !flow->two_way_traffic() )
             trk.set_tf_flags(TF_FORCE_FLUSH);
index 238e410a549506c5113600c390b54bd9cb403f42..156ea5932de78abe3c27a1bb976e5e439478faa0 100644 (file)
@@ -154,8 +154,7 @@ bool TcpStateSynRecv::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
         trk.update_tracker_ack_recv(tsd);
         trk.session->set_pkt_action_flag(trk.normalizer.handle_paws(tsd));
         flow->session_state |= STREAM_STATE_ACK;
-        if ( tsd.is_data_segment() )
-            trk.session->handle_data_segment(tsd);
+        trk.perform_fin_recv_flush(tsd);
 
         if ( trk.update_on_fin_recv(tsd) )
         {
index ee4843572a5a47b39b97925889a98998e45f60ca..974acd86017d16ab542390a986f219e490829073 100644 (file)
@@ -108,9 +108,7 @@ bool TcpStateSynSent::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker&
 
 bool TcpStateSynSent::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
 {
-    if ( tsd.is_data_segment() )
-        trk.session->handle_data_segment(tsd);
-
+    trk.perform_fin_recv_flush(tsd);
     return true;
 }
 
index 6c17227e01b17de3a7258f6d07a2c89079caa551..cd104813dc18b8fc8e5551f311c539d6281f1e40 100644 (file)
@@ -73,8 +73,8 @@ bool TcpStateTimeWait::fin_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk
         trk.normalizer.packet_dropper(tsd, NORM_TCP_BLOCK);
         trk.session->set_pkt_action_flag(ACTION_BAD_PKT);
     }
-    else if ( tsd.is_data_segment() )
-        trk.session->handle_data_segment(tsd);
+    else
+        trk.perform_fin_recv_flush(tsd);
 
     return true;
 }
index f24400db2bfc3d172fc9a1aa46e0a619000841c3..42d2434941653da391808cda665216d653e67a2e 100644 (file)
@@ -636,6 +636,14 @@ bool TcpStreamTracker::set_held_packet(Packet* p)
     return true;
 }
 
+void TcpStreamTracker::perform_fin_recv_flush(TcpSegmentDescriptor& tsd)
+{
+    if ( tsd.is_data_segment() )
+        session->handle_data_segment(tsd);
+    else if ( flush_policy == STREAM_FLPOLICY_ON_DATA and SEQ_EQ(tsd.get_seq(), rcv_nxt) )
+        reassembler.flush_queued_segments(tsd.get_flow(), true, tsd.get_pkt());
+}
+
 uint32_t TcpStreamTracker::perform_partial_flush()
 {
     uint32_t flushed = 0;
index 1b6644e5c31e67f1a18446a38dd6c418d8844423..74d821d10e11d482a9f723eb5cc4c2cddb4454a8 100644 (file)
@@ -289,6 +289,7 @@ public:
     bool is_retransmit_of_held_packet(snort::Packet*);
     void finalize_held_packet(snort::Packet*);
     void finalize_held_packet(snort::Flow*);
+    void perform_fin_recv_flush(TcpSegmentDescriptor&);
     uint32_t perform_partial_flush();
     bool is_holding_packet() const { return held_packet != null_iterator; }