From: Vitalii Serhiiovych Horbatov -X (vhorbato - SOFTSERVE INC at Cisco) Date: Wed, 22 Jan 2025 09:29:59 +0000 (+0000) Subject: Pull request #4578: extractor: add handling for connector creation failure X-Git-Tag: 3.6.3.0~13 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5f683358db260c9234929d36bf05b54b882026d8;p=thirdparty%2Fsnort3.git Pull request #4578: extractor: add handling for connector creation failure Merge in SNORT/snort3 from ~VHORBATO/snort3:extractor_def_conn to master Squashed commit of the following: commit d92481c95a95629cbef6d4f289fb7ab7aeb7a148 Author: vhorbato Date: Fri Jan 17 17:47:52 2025 +0200 extractor: add handling for connector creation failure --- diff --git a/src/managers/connector_manager.cc b/src/managers/connector_manager.cc index 77f0059c9..da6e57620 100644 --- a/src/managers/connector_manager.cc +++ b/src/managers/connector_manager.cc @@ -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; + } } } } diff --git a/src/network_inspectors/extractor/CMakeLists.txt b/src/network_inspectors/extractor/CMakeLists.txt index d67dd3565..ffe4691a8 100644 --- a/src/network_inspectors/extractor/CMakeLists.txt +++ b/src/network_inspectors/extractor/CMakeLists.txt @@ -16,6 +16,7 @@ set( FILE_LIST extractor_service.h extractors.cc extractors.h + extractor_null_conn.h ) add_library(extractor OBJECT ${FILE_LIST}) diff --git a/src/network_inspectors/extractor/extractor_csv_logger.cc b/src/network_inspectors/extractor/extractor_csv_logger.cc index 89dc9b006..cc2da11d4 100644 --- a/src/network_inspectors/extractor/extractor_csv_logger.cc +++ b/src/network_inspectors/extractor/extractor_csv_logger.cc @@ -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 +// extractor_csv_logger.cc author Anna Norokh #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/src/network_inspectors/extractor/extractor_csv_logger.h b/src/network_inspectors/extractor/extractor_csv_logger.h index 183f59be6..db32d7273 100644 --- a/src/network_inspectors/extractor/extractor_csv_logger.h +++ b/src/network_inspectors/extractor/extractor_csv_logger.h @@ -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 +// extractor_csv_logger.h author Anna Norokh #ifndef EXTRACTOR_CSV_LOGGER_H #define EXTRACTOR_CSV_LOGGER_H diff --git a/src/network_inspectors/extractor/extractor_json_logger.cc b/src/network_inspectors/extractor/extractor_json_logger.cc index b0b4e3987..f9d8c1275 100644 --- a/src/network_inspectors/extractor/extractor_json_logger.cc +++ b/src/network_inspectors/extractor/extractor_json_logger.cc @@ -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" diff --git a/src/network_inspectors/extractor/extractor_json_logger.h b/src/network_inspectors/extractor/extractor_json_logger.h index e24e7a76e..578e732f5 100644 --- a/src/network_inspectors/extractor/extractor_json_logger.h +++ b/src/network_inspectors/extractor/extractor_json_logger.h @@ -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 diff --git a/src/network_inspectors/extractor/extractor_logger.cc b/src/network_inspectors/extractor/extractor_logger.cc index 3c65469cd..c14d3bd67 100644 --- a/src/network_inspectors/extractor/extractor_logger.cc +++ b/src/network_inspectors/extractor/extractor_logger.cc @@ -26,6 +26,7 @@ #include #include "log/messages.h" +#include "main/thread.h" #include "managers/connector_manager.h" #include "extractor_csv_logger.h" @@ -33,14 +34,18 @@ 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()) diff --git a/src/network_inspectors/extractor/extractor_logger.h b/src/network_inspectors/extractor/extractor_logger.h index 05d9f09b4..922c15cfe 100644 --- a/src/network_inspectors/extractor/extractor_logger.h +++ b/src/network_inspectors/extractor/extractor_logger.h @@ -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 index 000000000..bdcf34246 --- /dev/null +++ b/src/network_inspectors/extractor/extractor_null_conn.h @@ -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 + +#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 diff --git a/src/network_inspectors/extractor/extractor_service.cc b/src/network_inspectors/extractor/extractor_service.cc index afed145d4..92945a734 100644 --- a/src/network_inspectors/extractor/extractor_service.cc +++ b/src/network_inspectors/extractor/extractor_service.cc @@ -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 +// extractor_service.cc author Maya Dagon #ifdef HAVE_CONFIG_H #include "config.h"