Merge in SNORT/snort3 from ~JALIIMRA/snort3:seglist_window to master
Squashed commit of the following:
commit
872c4d9796db0b8099005542889da60d353fc8af
Author: Juweria Ali Imran <jaliimra@cisco.com>
Date: Mon Sep 11 11:56:03 2023 -0400
stream_tcp: examine whether a segment plugs a hole before blocking due to exceeding queue_limit
}
}
+bool TcpReassembler::segment_within_seglist_window(TcpReassemblerState& trs, TcpSegmentDescriptor& tsd)
+{
+ uint32_t start, end = (trs.sos.seglist.tail->i_seq + trs.sos.seglist.tail->i_len);
+
+ if ( SEQ_LT(trs.sos.seglist_base_seq, trs.sos.seglist.head->i_seq) )
+ start = trs.sos.seglist_base_seq;
+ else
+ start = trs.sos.seglist.head->i_seq;
+
+ // Left side
+ if ( SEQ_LEQ(tsd.get_end_seq(), start) )
+ return false;
+
+ // Right side
+ if ( SEQ_GEQ(tsd.get_seq(), end) )
+ return false;
+
+ return true;
+}
+
void TcpReassembler::check_first_segment_hole(TcpReassemblerState& trs)
{
if ( SEQ_LT(trs.sos.seglist_base_seq, trs.sos.seglist.head->c_seq)
virtual int update_alert(TcpReassemblerState&, uint32_t gid, uint32_t sid,
uint32_t event_id, uint32_t event_second);
virtual void purge_alerts(TcpReassemblerState&);
+ virtual bool segment_within_seglist_window(TcpReassemblerState&, TcpSegmentDescriptor&);
uint32_t perform_partial_flush(TcpReassemblerState&, snort::Flow*, snort::Packet*&);
void set_norm_mode_test()
{ trs.sos.tcp_ips_data = NORM_MODE_TEST; }
+ bool segment_within_seglist_window(TcpSegmentDescriptor& tsd)
+ { return reassembler->segment_within_seglist_window(trs, tsd); }
+
uint32_t perform_partial_flush(snort::Flow* flow, snort::Packet*& p)
{ return reassembler->perform_partial_flush(trs, flow, p); }
(const_cast<tcp::TCPHdr*>(tsd.get_pkt()->ptrs.tcph))->set_seq(listener->max_queue_seq_nxt);
}
+ if( listener->reassembler.segment_within_seglist_window(tsd) )
+ return false;
+
if ( inline_mode || listener->normalizer.get_trim_win() == NORM_MODE_ON)
{
tsd.get_pkt()->active->set_drop_reason("stream");
(const_cast<tcp::TCPHdr*>(tsd.get_pkt()->ptrs.tcph))->set_seq(listener->max_queue_seq_nxt);
}
+ if( listener->reassembler.segment_within_seglist_window(tsd) )
+ return false;
+
if ( inline_mode || listener->normalizer.get_trim_win() == NORM_MODE_ON)
{
tsd.get_pkt()->active->set_drop_reason("stream");