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
{
delete infractions[k];
delete events[k];
- delete hi_ss[k];
+ hi_ss[k]->go_away();
delete[] frame_data[k];
}
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; }
private:
friend Http2Api;
+ Http2StreamSplitter splitter[2] = { true, false };
+
const Http2ParaList* const params;
};
// 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;
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; }
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);
// 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
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; }
{ }
TcpStreamTracker::~TcpStreamTracker()
-{ delete splitter; }
+{ if (splitter != nullptr) splitter->go_away(); }
TcpStreamTracker::TcpEvent TcpStreamTracker::set_tcp_event(const TcpSegmentDescriptor& tsd)
{
void TcpStreamTracker::set_splitter(StreamSplitter* ss)
{
if ( splitter )
- delete splitter;
+ splitter->go_away();
splitter = ss;
{
if ( splitter )
{
- delete splitter;
+ splitter->go_away();
splitter = nullptr;
}
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;
UserTracker& ut = c2s ? server : client;
if ( ut.splitter )
- delete ut.splitter;
+ ut.splitter->go_away();
ut.splitter = ss;