From: Tom Peters (thopeter) Date: Fri, 5 Oct 2018 15:13:34 +0000 (-0400) Subject: Merge pull request #1378 in SNORT/snort3 from perfmon_segfault to master X-Git-Tag: 3.0.0-249~35 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f908e68fbfa0644f526f06349b9845f82782c7bc;p=thirdparty%2Fsnort3.git Merge pull request #1378 in SNORT/snort3 from perfmon_segfault to master Squashed commit of the following: commit c2e34ca15b12faa98a6e0090fa403d331c0076df Author: mdagon Date: Mon Sep 24 15:08:47 2018 -0400 perf_monitor: trackers keep copy of the relevant config items from the inspector --- diff --git a/src/network_inspectors/perf_monitor/base_tracker.cc b/src/network_inspectors/perf_monitor/base_tracker.cc index 02ab65ae0..fa43edc7c 100644 --- a/src/network_inspectors/perf_monitor/base_tracker.cc +++ b/src/network_inspectors/perf_monitor/base_tracker.cc @@ -32,9 +32,10 @@ using namespace snort; using namespace std; -BaseTracker::BaseTracker(PerfConfig* perf) : PerfTracker(perf, PERF_NAME "_base") +BaseTracker::BaseTracker(PerfConfig* perf) : PerfTracker(perf, PERF_NAME "_base"), + modules(perf->modules), mods_to_prep(perf->mods_to_prep) { - for ( ModuleConfig& mod : config->modules ) + for ( ModuleConfig& mod : modules ) { formatter->register_section(mod.ptr->get_name()); @@ -46,12 +47,12 @@ BaseTracker::BaseTracker(PerfConfig* perf) : PerfTracker(perf, PERF_NAME "_base" void BaseTracker::process(bool summary) { - for ( Module* mod : config->mods_to_prep ) + for ( Module* mod : mods_to_prep ) mod->prep_counts(); write(); - for ( const ModuleConfig& mod : config->modules ) + for ( const ModuleConfig& mod : modules ) if ( !summary ) mod.ptr->sum_stats(false); } diff --git a/src/network_inspectors/perf_monitor/base_tracker.h b/src/network_inspectors/perf_monitor/base_tracker.h index 3a0735bfd..d801c40d7 100644 --- a/src/network_inspectors/perf_monitor/base_tracker.h +++ b/src/network_inspectors/perf_monitor/base_tracker.h @@ -29,6 +29,10 @@ public: BaseTracker(PerfConfig* perf); void process(bool) override; + +private: + std::vector modules; + std::vector mods_to_prep; }; #endif diff --git a/src/network_inspectors/perf_monitor/flow_ip_tracker.cc b/src/network_inspectors/perf_monitor/flow_ip_tracker.cc index da61cb4a8..2750ff969 100644 --- a/src/network_inspectors/perf_monitor/flow_ip_tracker.cc +++ b/src/network_inspectors/perf_monitor/flow_ip_tracker.cc @@ -72,7 +72,8 @@ FlowStateValue* FlowIPTracker::find_stats(const SfIp* src_addr, const SfIp* dst_ return value; } -FlowIPTracker::FlowIPTracker(PerfConfig* perf) : PerfTracker(perf, TRACKER_NAME) +FlowIPTracker::FlowIPTracker(PerfConfig* perf) : PerfTracker(perf, TRACKER_NAME), + perf_flags(perf->perf_flags) { formatter->register_section("flow_ip"); formatter->register_field("ip_a", ip_a); @@ -178,7 +179,7 @@ void FlowIPTracker::process(bool) write(); } - if ( !(config->perf_flags & PERF_SUMMARY) ) + if ( !(perf_flags & PERF_SUMMARY) ) reset(); } diff --git a/src/network_inspectors/perf_monitor/flow_ip_tracker.h b/src/network_inspectors/perf_monitor/flow_ip_tracker.h index eaccf2cbf..258e2b796 100644 --- a/src/network_inspectors/perf_monitor/flow_ip_tracker.h +++ b/src/network_inspectors/perf_monitor/flow_ip_tracker.h @@ -73,6 +73,7 @@ private: FlowStateValue stats; snort::XHash* ip_map; char ip_a[41], ip_b[41]; + int perf_flags; FlowStateValue* find_stats(const snort::SfIp* src_addr, const snort::SfIp* dst_addr, int* swapped); void write_stats(); diff --git a/src/network_inspectors/perf_monitor/flow_tracker.cc b/src/network_inspectors/perf_monitor/flow_tracker.cc index d5484b949..1256ca769 100644 --- a/src/network_inspectors/perf_monitor/flow_tracker.cc +++ b/src/network_inspectors/perf_monitor/flow_tracker.cc @@ -39,13 +39,14 @@ using namespace snort; #define MAX_PKT_LEN 9000 -FlowTracker::FlowTracker(PerfConfig* perf) : PerfTracker(perf, TRACKER_NAME) +FlowTracker::FlowTracker(PerfConfig* perf) : PerfTracker(perf, TRACKER_NAME), + flow_max_port_to_track(perf->flow_max_port_to_track) { pkt_len_cnt.resize( MAX_PKT_LEN + 1 ); - tcp.src.resize( config->flow_max_port_to_track + 1, 0 ); - tcp.dst.resize( config->flow_max_port_to_track + 1, 0 ); - udp.src.resize( config->flow_max_port_to_track + 1, 0 ); - udp.dst.resize( config->flow_max_port_to_track + 1, 0 ); + tcp.src.resize( flow_max_port_to_track + 1, 0 ); + tcp.dst.resize( flow_max_port_to_track + 1, 0 ); + udp.src.resize( flow_max_port_to_track + 1, 0 ); + udp.dst.resize( flow_max_port_to_track + 1, 0 ); type_icmp.resize( UINT8_MAX + 1, 0 ); formatter->register_section("flow"); @@ -120,20 +121,20 @@ void FlowTracker::clear() void FlowTracker::update_transport_flows(int sport, int dport, FlowProto& proto, int len) { - if (sport <= config->flow_max_port_to_track && - dport > config->flow_max_port_to_track) + if (sport <= flow_max_port_to_track && + dport > flow_max_port_to_track) { proto.src[sport] += len; } - else if (dport <= config->flow_max_port_to_track && - sport > config->flow_max_port_to_track) + else if (dport <= flow_max_port_to_track && + sport > flow_max_port_to_track) { proto.dst[dport] += len; } - else if (sport <= config->flow_max_port_to_track && - dport <= config->flow_max_port_to_track) + else if (sport <= flow_max_port_to_track && + dport <= flow_max_port_to_track) { proto.src[sport] += len; proto.dst[dport] += len; diff --git a/src/network_inspectors/perf_monitor/flow_tracker.h b/src/network_inspectors/perf_monitor/flow_tracker.h index cbf85bb0d..6894aea42 100644 --- a/src/network_inspectors/perf_monitor/flow_tracker.h +++ b/src/network_inspectors/perf_monitor/flow_tracker.h @@ -43,6 +43,7 @@ protected: private: PegCount byte_total = 0; + int flow_max_port_to_track; std::vector pkt_len_cnt; PegCount pkt_len_oversize_cnt = 0; diff --git a/src/network_inspectors/perf_monitor/perf_tracker.cc b/src/network_inspectors/perf_monitor/perf_tracker.cc index 2d2b44f79..3fe2f1470 100644 --- a/src/network_inspectors/perf_monitor/perf_tracker.cc +++ b/src/network_inspectors/perf_monitor/perf_tracker.cc @@ -62,7 +62,7 @@ static inline bool check_file_size(FILE* fh, uint64_t max_file_size) PerfTracker::PerfTracker(PerfConfig* config, const char* tracker_name) { - this->config = config; + max_file_size = config->max_file_size; switch (config->format) { @@ -342,7 +342,7 @@ bool PerfTracker::rotate() { if (fh && fh != stdout) { - if (!rotate_file(fname.c_str(), fh, config->max_file_size)) + if (!rotate_file(fname.c_str(), fh, max_file_size)) return false; return open(false); @@ -352,7 +352,7 @@ bool PerfTracker::rotate() bool PerfTracker::auto_rotate() { - if (fh && fh != stdout && check_file_size(fh, config->max_file_size)) + if (fh && fh != stdout && check_file_size(fh, max_file_size)) return rotate(); return true; diff --git a/src/network_inspectors/perf_monitor/perf_tracker.h b/src/network_inspectors/perf_monitor/perf_tracker.h index 1162eee77..b84a39cab 100644 --- a/src/network_inspectors/perf_monitor/perf_tracker.h +++ b/src/network_inspectors/perf_monitor/perf_tracker.h @@ -69,7 +69,8 @@ public: PerfTracker& operator=(const PerfTracker&) = delete; protected: - PerfConfig* config; + uint64_t max_file_size = 0; + PerfFormatter* formatter; PerfTracker(PerfConfig*, const char* tracker_name);