]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
Pull request #3782: appid: Fixed TSAN warnings
authorSreeja Athirkandathil Narayanan (sathirka) <sathirka@cisco.com>
Mon, 10 Apr 2023 16:03:02 +0000 (16:03 +0000)
committerSreeja Athirkandathil Narayanan (sathirka) <sathirka@cisco.com>
Mon, 10 Apr 2023 16:03:02 +0000 (16:03 +0000)
Merge in SNORT/snort3 from ~BSACHDEV/snort3:tsan_warnings_part1 to master

Squashed commit of the following:

commit b2934642d9bf0fcf7d53f6fc80c4540e7a63736c
Author: bsachdev <bsachdev@cisco.com>
Date:   Wed Mar 8 09:03:53 2023 -0500

    appid: Fixed TSAN warnings

src/network_inspectors/appid/appid_inspector.cc
src/network_inspectors/appid/appid_module.cc
src/network_inspectors/appid/service_plugins/service_discovery.cc
src/network_inspectors/appid/service_plugins/service_discovery.h
src/network_inspectors/appid/service_plugins/service_rpc.cc
src/search_engines/acsmx2.cc

index 77060b19fb2363f8c1c22a3f919e8878d0a77b90..07eaf17c3e32e84a8b150aead138d2e7c6ea84c2 100644 (file)
@@ -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*)
index af0919af74fb8f35e8c944a27451f04fb1223420..74dbccda623dacf8d23523a7a551db7c18c0e904 100644 (file)
@@ -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 = &current_odp_ctxt;
+
     assert(odp_thread_local_ctxt);
     delete odp_thread_local_ctxt;
     odp_thread_local_ctxt = new OdpThreadContext;
index 9e6707b81e2c790d3de7e82948c0afe42ebce11a..0a8aad80e6b099153b280252d69d3a8538d83671 100644 (file)
@@ -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)
 {
index d5efabce044d2d0886944d6205e897d7e3592c06..e3aa961dcd7bfcdfe21161065e825b1f470dfa0c 100644 (file)
@@ -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&);
index b2bbc05e8ebd1a485e0520f3b055553ae4331253..7fb57ced12bf1deeec8440783cde9bad51bf8cd9 100644 (file)
@@ -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 = &sub;
@@ -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 = &sub;
             }
index 6dda19b492db52819651fbb1bdebcd0939eabac8..adad86835452ac40bf38eed5b613d235e82a4ae6 100644 (file)
 
 #include <cassert>
 #include <list>
+#include <mutex>
 
 #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<std::mutex> 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)