This is an automated email from the ASF dual-hosted git repository. szaszm pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git
commit be303840d2ddf3826f6e60f22440f5873504ecf0 Author: Adam Debreceni <[email protected]> AuthorDate: Thu Sep 22 15:47:08 2022 +0200 MINIFICPP-1936 Fix python scripting symbol issues Hide symbols from built-in libressl, re-dlopen an extension as global if it says so. Closes #1416 Signed-off-by: Marton Szasz <[email protected]> --- cmake/BundledLibreSSL.cmake | 5 ++++ extensions/script/pythonloader/PyProcLoader.cpp | 4 +++ libminifi/include/core/extension/DynamicLibrary.h | 17 +++---------- .../include/core/extension/ExtensionManager.h | 14 ++--------- libminifi/src/core/extension/DynamicLibrary.cpp | 29 +++++++++++----------- libminifi/src/core/extension/ExtensionManager.cpp | 22 ++++++++-------- 6 files changed, 40 insertions(+), 51 deletions(-) diff --git a/cmake/BundledLibreSSL.cmake b/cmake/BundledLibreSSL.cmake index d78a0c818..2b25234ab 100644 --- a/cmake/BundledLibreSSL.cmake +++ b/cmake/BundledLibreSSL.cmake @@ -44,6 +44,11 @@ function(use_libre_ssl SOURCE_DIR BINARY_DIR) "-DCMAKE_INSTALL_PREFIX=${LIBRESSL_BIN_DIR}" -DLIBRESSL_APPS=OFF -DLIBRESSL_TESTS=OFF + -DCMAKE_POLICY_DEFAULT_CMP0063=NEW + # avoid polluting the global namespace, otherwise could interfere with the system openssl (e.g. python script extension using numpy) + -DCMAKE_C_VISIBILITY_PRESET=hidden + -DCMAKE_CXX_VISIBILITY_PRESET=hidden + -DCMAKE_VISIBILITY_INLINES_HIDDEN=ON ) # Build project diff --git a/extensions/script/pythonloader/PyProcLoader.cpp b/extensions/script/pythonloader/PyProcLoader.cpp index e17bbbd84..0d7bf800e 100644 --- a/extensions/script/pythonloader/PyProcLoader.cpp +++ b/extensions/script/pythonloader/PyProcLoader.cpp @@ -35,5 +35,9 @@ static void deinit() { // TODO(adebreceni): deinitialization is not implemented } +// request this module (shared library) to be opened into the global namespace, exposing +// the symbols of the python library +extern "C" const int LOAD_MODULE_AS_GLOBAL = 1; + REGISTER_EXTENSION("PythonExtension", init, deinit); diff --git a/libminifi/include/core/extension/DynamicLibrary.h b/libminifi/include/core/extension/DynamicLibrary.h index eb642bfd6..bd63c0f7f 100644 --- a/libminifi/include/core/extension/DynamicLibrary.h +++ b/libminifi/include/core/extension/DynamicLibrary.h @@ -24,12 +24,7 @@ #include "Module.h" -namespace org { -namespace apache { -namespace nifi { -namespace minifi { -namespace core { -namespace extension { +namespace org::apache::nifi::minifi::core::extension { class DynamicLibrary : public Module { friend class ExtensionManager; @@ -52,8 +47,9 @@ class DynamicLibrary : public Module { int dlclose(void* handle); #endif - bool load(); + bool load(bool global = false); bool unload(); + void* findSymbol(const char* name); std::filesystem::path library_path_; gsl::owner<void*> handle_ = nullptr; @@ -61,9 +57,4 @@ class DynamicLibrary : public Module { static const std::shared_ptr<logging::Logger> logger_; }; -} // namespace extension -} // namespace core -} // namespace minifi -} // namespace nifi -} // namespace apache -} // namespace org +} // namespace org::apache::nifi::minifi::core::extension diff --git a/libminifi/include/core/extension/ExtensionManager.h b/libminifi/include/core/extension/ExtensionManager.h index 0c099c3ae..c61ecb07b 100644 --- a/libminifi/include/core/extension/ExtensionManager.h +++ b/libminifi/include/core/extension/ExtensionManager.h @@ -25,12 +25,7 @@ #include "Module.h" #include "properties/Configure.h" -namespace org { -namespace apache { -namespace nifi { -namespace minifi { -namespace core { -namespace extension { +namespace org::apache::nifi::minifi::core::extension { class ExtensionManager { ExtensionManager(); @@ -51,9 +46,4 @@ class ExtensionManager { static const std::shared_ptr<logging::Logger> logger_; }; -} // namespace extension -} // namespace core -} // namespace minifi -} // namespace nifi -} // namespace apache -} // namespace org +} // namespace org::apache::nifi::minifi::core::extension diff --git a/libminifi/src/core/extension/DynamicLibrary.cpp b/libminifi/src/core/extension/DynamicLibrary.cpp index 11beed283..08f17e7e7 100644 --- a/libminifi/src/core/extension/DynamicLibrary.cpp +++ b/libminifi/src/core/extension/DynamicLibrary.cpp @@ -38,12 +38,7 @@ #include "utils/GeneralUtils.h" #include "core/logging/LoggerConfiguration.h" -namespace org { -namespace apache { -namespace nifi { -namespace minifi { -namespace core { -namespace extension { +namespace org::apache::nifi::minifi::core::extension { const std::shared_ptr<logging::Logger> DynamicLibrary::logger_ = logging::LoggerFactory<DynamicLibrary>::getLogger(); @@ -52,9 +47,13 @@ DynamicLibrary::DynamicLibrary(std::string name, std::filesystem::path library_p library_path_(std::move(library_path)) { } -bool DynamicLibrary::load() { +bool DynamicLibrary::load(bool global) { dlerror(); - handle_ = dlopen(library_path_.string().c_str(), RTLD_NOW | RTLD_LOCAL); + if (global) { + handle_ = dlopen(library_path_.string().c_str(), RTLD_NOW | RTLD_GLOBAL); + } else { + handle_ = dlopen(library_path_.string().c_str(), RTLD_NOW | RTLD_LOCAL); + } if (!handle_) { logger_->log_error("Failed to load extension '%s' at '%s': %s", name_, library_path_.string(), dlerror()); return false; @@ -80,6 +79,13 @@ bool DynamicLibrary::unload() { return true; } +void* DynamicLibrary::findSymbol(const char *name) { + if (!handle_) { + throw std::logic_error("Dynamic library has not been loaded"); + } + return dlsym(handle_, name); +} + DynamicLibrary::~DynamicLibrary() = default; #ifdef WIN32 @@ -187,9 +193,4 @@ int DynamicLibrary::dlclose(void* handle) { #endif -} // namespace extension -} // namespace core -} // namespace minifi -} // namespace nifi -} // namespace apache -} // namespace org +} // namespace org::apache::nifi::minifi::core::extension diff --git a/libminifi/src/core/extension/ExtensionManager.cpp b/libminifi/src/core/extension/ExtensionManager.cpp index 8e63a80d6..336e7fea1 100644 --- a/libminifi/src/core/extension/ExtensionManager.cpp +++ b/libminifi/src/core/extension/ExtensionManager.cpp @@ -27,12 +27,7 @@ #include "core/extension/Utils.h" #include "properties/Configuration.h" -namespace org { -namespace apache { -namespace nifi { -namespace minifi { -namespace core { -namespace extension { +namespace org::apache::nifi::minifi::core::extension { const std::shared_ptr<logging::Logger> ExtensionManager::logger_ = logging::LoggerFactory<ExtensionManager>::getLogger(); @@ -82,6 +77,14 @@ bool ExtensionManager::initialize(const std::shared_ptr<Configure>& config) { // error already logged by method continue; } + // some modules (shared libraries) might need to be loaded into the global namespace exposing + // their definitions (e.g. python script extension) + if (module->findSymbol("LOAD_MODULE_AS_GLOBAL")) { + // reload library as global + if (!module->load(true)) { + continue; + } + } if (!module->initialize(config)) { logger_->log_error("Failed to initialize module '%s' at '%s'", library->name, library->getFullPath().string()); } else { @@ -104,9 +107,4 @@ void ExtensionManager::unregisterExtension(Extension& extension) { } } -} // namespace extension -} // namespace core -} // namespace minifi -} // namespace nifi -} // namespace apache -} // namespace org +} // namespace org::apache::nifi::minifi::core::extension
