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

Reply via email to