From: Sreeja Athirkandathil Narayanan (sathirka) Date: Mon, 10 Apr 2023 16:03:02 +0000 (+0000) Subject: Pull request #3782: appid: Fixed TSAN warnings X-Git-Tag: 3.1.60.0~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0a3d6e7ef8be5364f4ffd83bcb6ccb69106de05c;p=thirdparty%2Fsnort3.git Pull request #3782: appid: Fixed TSAN warnings Merge in SNORT/snort3 from ~BSACHDEV/snort3:tsan_warnings_part1 to master Squashed commit of the following: commit b2934642d9bf0fcf7d53f6fc80c4540e7a63736c Author: bsachdev Date: Wed Mar 8 09:03:53 2023 -0500 appid: Fixed TSAN warnings --- diff --git a/src/network_inspectors/appid/appid_inspector.cc b/src/network_inspectors/appid/appid_inspector.cc index 77060b19f..07eaf17c3 100644 --- a/src/network_inspectors/appid/appid_inspector.cc +++ b/src/network_inspectors/appid/appid_inspector.cc @@ -172,6 +172,7 @@ void AppIdInspector::tinit() appidDebug->set_enabled(true); if ( snort::HighAvailabilityManager::active() ) AppIdHAManager::tinit(); + ServiceDiscovery::set_thread_local_ftp_service(); } void AppIdInspector::tterm() @@ -185,6 +186,7 @@ void AppIdInspector::tterm() pkt_thread_tp_appid_ctxt->tfini(); if ( snort::HighAvailabilityManager::active() ) AppIdHAManager::tterm(); + ServiceDiscovery::reset_thread_local_ftp_service(); } void AppIdInspector::tear_down(SnortConfig*) diff --git a/src/network_inspectors/appid/appid_module.cc b/src/network_inspectors/appid/appid_module.cc index af0919af7..74dbccda6 100644 --- a/src/network_inspectors/appid/appid_module.cc +++ b/src/network_inspectors/appid/appid_module.cc @@ -251,8 +251,9 @@ bool ACOdpContextSwap::execute(Analyzer&, void**) AppIdPegCounts::cleanup_pegs(); AppIdServiceState::initialize(ctxt.config.memcap); AppIdPegCounts::init_pegs(); - + ServiceDiscovery::set_thread_local_ftp_service(); pkt_thread_odp_ctxt = ¤t_odp_ctxt; + assert(odp_thread_local_ctxt); delete odp_thread_local_ctxt; odp_thread_local_ctxt = new OdpThreadContext; diff --git a/src/network_inspectors/appid/service_plugins/service_discovery.cc b/src/network_inspectors/appid/service_plugins/service_discovery.cc index 9e6707b81..0a8aad80e 100644 --- a/src/network_inspectors/appid/service_plugins/service_discovery.cc +++ b/src/network_inspectors/appid/service_plugins/service_discovery.cc @@ -81,6 +81,7 @@ using namespace snort; static ServiceDetector* ftp_service; +static THREAD_LOCAL ServiceDetector* pkt_thread_ftp_service; void ServiceDiscovery::initialize(AppIdInspector& inspector) { @@ -563,9 +564,9 @@ int ServiceDiscovery::identify_service(AppIdSession& asd, Packet* p, int ServiceDiscovery::add_ftp_service_state(AppIdSession& asd) { - if (!ftp_service) + if (!pkt_thread_ftp_service) return -1; - return asd.add_flow_data_id(21, ftp_service); + return asd.add_flow_data_id(21, pkt_thread_ftp_service); } void ServiceDiscovery::clear_ftp_service_state() @@ -573,6 +574,16 @@ void ServiceDiscovery::clear_ftp_service_state() ftp_service = nullptr; } +void ServiceDiscovery::set_thread_local_ftp_service() +{ + pkt_thread_ftp_service = ftp_service; +} + +void ServiceDiscovery::reset_thread_local_ftp_service() +{ + pkt_thread_ftp_service = nullptr; +} + bool ServiceDiscovery::do_service_discovery(AppIdSession& asd, Packet* p, AppidSessionDirection direction, AppidChangeBits& change_bits) { diff --git a/src/network_inspectors/appid/service_plugins/service_discovery.h b/src/network_inspectors/appid/service_plugins/service_discovery.h index d5efabce0..e3aa961dc 100644 --- a/src/network_inspectors/appid/service_plugins/service_discovery.h +++ b/src/network_inspectors/appid/service_plugins/service_discovery.h @@ -81,7 +81,8 @@ public: int incompatible_data(AppIdSession&, const snort::Packet*, AppidSessionDirection dir, ServiceDetector*); static int add_ftp_service_state(AppIdSession&); static void clear_ftp_service_state(); - + static void set_thread_local_ftp_service(); + static void reset_thread_local_ftp_service(); private: void get_next_service(const snort::Packet*, const AppidSessionDirection dir, AppIdSession&); void get_port_based_services(IpProtocol, uint16_t port, AppIdSession&); diff --git a/src/network_inspectors/appid/service_plugins/service_rpc.cc b/src/network_inspectors/appid/service_plugins/service_rpc.cc index b2bbc05e8..7fb57ced1 100644 --- a/src/network_inspectors/appid/service_plugins/service_rpc.cc +++ b/src/network_inspectors/appid/service_plugins/service_rpc.cc @@ -564,7 +564,6 @@ int RpcServiceDetector::validate_packet(const uint8_t* data, uint16_t size, Appi int RpcServiceDetector::rpc_udp_validate(AppIdDiscoveryArgs& args) { - static char subname[64]; ServiceRPCData* rd; AppIdServiceSubtype sub; AppIdServiceSubtype* subtype; @@ -611,6 +610,7 @@ done: } else if (program) { + char subname[64]; snprintf(subname, sizeof(subname), "(%u)", program); sub.service = subname; subtype = ⊂ @@ -655,7 +655,6 @@ int RpcServiceDetector::rpc_tcp_validate(AppIdDiscoveryArgs& args) const ServiceRPCCall* call; const ServiceRPCReply* reply; - static char subname[64]; AppIdServiceSubtype sub; AppIdServiceSubtype* subtype; uint32_t program = 0; @@ -958,7 +957,8 @@ inprocess: } else if (program) { - sprintf(subname, "(%u)", program); + char subname[64]; + snprintf(subname, sizeof(subname), "(%u)", program); sub.service = subname; subtype = ⊂ } diff --git a/src/search_engines/acsmx2.cc b/src/search_engines/acsmx2.cc index 6dda19b49..adad86835 100644 --- a/src/search_engines/acsmx2.cc +++ b/src/search_engines/acsmx2.cc @@ -125,6 +125,7 @@ #include #include +#include #include "log/messages.h" #include "utils/stats.h" @@ -181,14 +182,22 @@ void acsm_init_summary() } static uint8_t xlatcase[256]; +static bool xlatinit = true; void acsmx2_init_xlatcase() { + static std::mutex _m; + std::lock_guard lock(_m); + if ( !xlatinit ) + return; + int i; for (i = 0; i < 256; i++) { xlatcase[i] = (uint8_t)toupper(i); } + + xlatinit = false; } static inline void ConvertCaseEx(uint8_t* d, const uint8_t* s, int m)