Merge in SNORT/snort3 from ~SMINUT/snort3:single_finish2 to master
Squashed commit of the following:
commit
56d6b7e2091d7752f955af1a2d4cc97c18e19bd0
Author: Silviu Minut <sminut@cisco.com>
Date: Thu Jan 13 20:15:50 2022 -0500
stream_tcp: ensure that we call splitter finish() only once per flow, per direction
TcpReassemblerState& trs, Flow* flow, bool clear, Packet* p)
{
bool pending = clear and paf_initialized(&trs.paf_state)
- and (!trs.tracker->get_splitter() || trs.tracker->get_splitter()->finish(flow) );
+ and trs.tracker->splitter_finish(flow);
if ( pending and !(flow->ssn_state.ignore_direction & trs.ignore_dir) )
final_flush(trs, p, trs.packet_dir);
break;
if ( trs.paf_state.paf == StreamSplitter::ABORT )
- trs.tracker->get_splitter()->finish(p->flow);
+ trs.tracker->splitter_finish(p->flow);
// for consistency with other cases, should return total
// but that breaks flushing pipelined pdus
held_packet = null_iterator;
flush_policy = STREAM_FLPOLICY_IGNORE;
reassembler.reset();
+ splitter_finish_flag = false;
}
//-------------------------------------------------------------------------
set_splitter(new AtomSplitter(!client_tracker) );
}
+bool TcpStreamTracker::splitter_finish(snort::Flow* flow)
+{
+ if (!splitter)
+ return true;
+
+ if (!splitter_finish_flag)
+ {
+ splitter_finish_flag = true;
+ return splitter->finish(flow);
+ }
+ // there shouldn't be any un-flushed data beyond this point,
+ // returning false here, discards it
+ return false;
+}
+
void TcpStreamTracker::init_on_syn_sent(TcpSegmentDescriptor& tsd)
{
tsd.get_flow()->set_session_flags(SSNFLAG_SEEN_CLIENT);
bool is_splitter_paf() const
{ return splitter && splitter->is_paf(); }
+ bool splitter_finish(snort::Flow* flow);
+
bool is_reassembly_enabled() const
{ return ( splitter and (flush_policy != STREAM_FLPOLICY_IGNORE) ); }
FlushPolicy flush_policy = STREAM_FLPOLICY_IGNORE;
bool mac_addr_valid = false;
bool fin_seq_set = false; // FIXIT-M should be obviated by tcp state
+ bool splitter_finish_flag = false;
};
// <--- note -- the 'state' parameter must be a reference