]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
Pull request #4578: extractor: add handling for connector creation failure
authorVitalii Serhiiovych Horbatov -X (vhorbato - SOFTSERVE INC at Cisco) <vhorbato@cisco.com>
Wed, 22 Jan 2025 09:29:59 +0000 (09:29 +0000)
committerOleksii Shumeiko -X (oshumeik - SOFTSERVE INC at Cisco) <oshumeik@cisco.com>
Wed, 22 Jan 2025 09:29:59 +0000 (09:29 +0000)
Merge in SNORT/snort3 from ~VHORBATO/snort3:extractor_def_conn to master

Squashed commit of the following:

commit d92481c95a95629cbef6d4f289fb7ab7aeb7a148
Author: vhorbato <vhorbato@cisco.com>
Date:   Fri Jan 17 17:47:52 2025 +0200

    extractor: add handling for connector creation failure

src/managers/connector_manager.cc
src/network_inspectors/extractor/CMakeLists.txt
src/network_inspectors/extractor/extractor_csv_logger.cc
src/network_inspectors/extractor/extractor_csv_logger.h
src/network_inspectors/extractor/extractor_json_logger.cc
src/network_inspectors/extractor/extractor_json_logger.h
src/network_inspectors/extractor/extractor_logger.cc
src/network_inspectors/extractor/extractor_logger.h
src/network_inspectors/extractor/extractor_null_conn.h [new file with mode: 0644]
src/network_inspectors/extractor/extractor_service.cc

index 77f0059c9ea9b7b6ed25788ca708b1ab90038156..da6e57620bbdec073de3284e31c5120246c05e85 100644 (file)
@@ -127,7 +127,6 @@ void ConnectorManager::thread_init()
                 assert(!conn.second.thread_connectors[instance]);
 
                 Connector* connector = sc.api->tinit(conn.second.config);
-                assert(connector);
                 conn.second.thread_connectors[instance] = std::move(connector);
             }
         }
@@ -142,9 +141,8 @@ void ConnectorManager::thread_reinit()
     {
         for ( auto& conn : sc.connectors )
         {
-            assert(conn.second.thread_connectors[instance]);
-
-            conn.second.thread_connectors[instance]->reinit();
+            if (conn.second.thread_connectors[instance])
+                conn.second.thread_connectors[instance]->reinit();
         }
     }
 }
@@ -159,10 +157,11 @@ void ConnectorManager::thread_term()
         {
             for ( auto& conn : sc.connectors )
             {
-                assert(conn.second.thread_connectors[instance]);
-
-                sc.api->tterm(conn.second.thread_connectors[instance]);
-                conn.second.thread_connectors[instance] = nullptr;
+                if ( conn.second.thread_connectors[instance] )
+                {
+                    sc.api->tterm(conn.second.thread_connectors[instance]);
+                    conn.second.thread_connectors[instance] = nullptr;
+                }
             }
         }
     }
index d67dd3565b96d663f7014c3a16b37370f9b9e82a..ffe4691a879760f6c07933ede426332a22a77f3a 100644 (file)
@@ -16,6 +16,7 @@ set( FILE_LIST
     extractor_service.h
     extractors.cc
     extractors.h
+    extractor_null_conn.h
 )
 
 add_library(extractor OBJECT ${FILE_LIST})
index 89dc9b0060a105387aa4e3e1c35d235f2a49322e..cc2da11d44b19c4928ad8f978fbcab0c3abf87a8 100644 (file)
@@ -15,7 +15,7 @@
 // with this program; if not, write to the Free Software Foundation, Inc.,
 // 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 //--------------------------------------------------------------------------
-// csv_logger.cc author Anna Norokh <anorokh@cisco.com>
+// extractor_csv_logger.cc author Anna Norokh <anorokh@cisco.com>
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
index 183f59be61e2993de89aa583936c0d7ea0c23f90..db32d7273497657f72cb09859983d74d2edf2e65 100644 (file)
@@ -15,7 +15,7 @@
 // with this program; if not, write to the Free Software Foundation, Inc.,
 // 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 //--------------------------------------------------------------------------
-// csv_logger.h author Anna Norokh <anorokh@cisco.com>
+// extractor_csv_logger.h author Anna Norokh <anorokh@cisco.com>
 
 #ifndef EXTRACTOR_CSV_LOGGER_H
 #define EXTRACTOR_CSV_LOGGER_H
index b0b4e398798d5aada4b2d5dbe58c510199422426..f9d8c1275d3cec0eafa68053d135c00161f32904 100644 (file)
@@ -15,7 +15,7 @@
 // with this program; if not, write to the Free Software Foundation, Inc.,
 // 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 //--------------------------------------------------------------------------
-// json_logger.cc author Cisco
+// extractor_json_logger.cc author Cisco
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
index e24e7a76ed93d68a5ced1f4d3a4811014892cc4b..578e732f56f018eaa3cc1d16e9d78b52c14cb10a 100644 (file)
@@ -15,7 +15,7 @@
 // with this program; if not, write to the Free Software Foundation, Inc.,
 // 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 //--------------------------------------------------------------------------
-// json_logger.h author Cisco
+// extractor_json_logger.h author Cisco
 
 #ifndef EXTRACTOR_JSON_LOGGER_H
 #define EXTRACTOR_JSON_LOGGER_H
index 3c65469cd02a2fde70c85f050be519cafd5ffdf5..c14d3bd674ca36809cd7cfd03c836d5ca737b849 100644 (file)
@@ -26,6 +26,7 @@
 #include <cassert>
 
 #include "log/messages.h"
+#include "main/thread.h"
 #include "managers/connector_manager.h"
 
 #include "extractor_csv_logger.h"
 
 using namespace snort;
 
-static Connector* get_connector(const std::string& conn_name)
+Connector* ExtractorLogger::get_connector(const std::string& conn_name)
 {
     Connector* connector = ConnectorManager::get_connector(conn_name);
 
     if (connector == nullptr)
     {
-        ErrorMessage("Can't initialize extractor, unable to find Connector \"%s\"\n", conn_name.c_str());
-        abort();
+        ErrorMessage("Unable to get '%s' connector in thread %d, fallback to default\n",
+            conn_name.c_str(), get_instance_id());
+
+        static ExtractorNullConnector default_connector;
+
+        return &default_connector;
     }
 
     switch (connector->get_connector_direction())
index 05d9f09b4a19da3a452a9c663e1b4d1cfb059b8d..922c15cfecd2b7db64052be105886189cfb25956 100644 (file)
@@ -26,6 +26,7 @@
 #include "framework/connector.h"
 #include "sfip/sf_ip.h"
 
+#include "extractor_null_conn.h"
 #include "extractor_enums.h"
 
 class ExtractorLogger
@@ -62,6 +63,8 @@ public:
     void flush() { output_conn->flush(); }
 
 protected:
+    static snort::Connector* get_connector(const std::string& conn_name);
+
     snort::Connector* const output_conn;
 };
 
diff --git a/src/network_inspectors/extractor/extractor_null_conn.h b/src/network_inspectors/extractor/extractor_null_conn.h
new file mode 100644 (file)
index 0000000..bdcf342
--- /dev/null
@@ -0,0 +1,47 @@
+//--------------------------------------------------------------------------
+// Copyright (C) 2025-2025 Cisco and/or its affiliates. All rights reserved.
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the terms of the GNU General Public License Version 2 as published
+// by the Free Software Foundation.  You may not use, modify or distribute
+// this program under any other version of the GNU General Public License.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program; if not, write to the Free Software Foundation, Inc.,
+// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+//--------------------------------------------------------------------------
+// extractor_null_conn.h author Vitalii Horbatov <vhorbato@cisco.com>
+
+#ifndef EXTRACTOR_NULL_CONN_H
+#define EXTRACTOR_NULL_CONN_H
+
+#include "framework/connector.h"
+
+class ExtractorNullConnector : public snort::Connector
+{
+public:
+    ExtractorNullConnector() : snort::Connector(conf)
+    {
+        conf.connector_name = "null";
+        conf.direction = snort::Connector::CONN_DUPLEX;
+    }
+
+    bool transmit_message(const snort::ConnectorMsg&, const ID& = null) override
+    { return true; }
+
+    bool transmit_message(const snort::ConnectorMsg&&, const ID& = null) override
+    { return true; }
+
+    snort::ConnectorMsg receive_message(bool) override
+    { return snort::ConnectorMsg(); }
+
+private:
+    snort::ConnectorConfig conf;
+};
+
+#endif
index afed145d444a66f3e5c02e44a1abd74cfa598ebf..92945a7348c3ac4cc313e0bec14dd1578de28742 100644 (file)
@@ -15,7 +15,7 @@
 // with this program; if not, write to the Free Software Foundation, Inc.,
 // 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 //--------------------------------------------------------------------------
-// extractor_services.cc author Maya Dagon <mdagon@cisco.com>
+// extractor_service.cc author Maya Dagon <mdagon@cisco.com>
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"