From 13d83395e674c3c5f085f06235726f216ab47bb5 Mon Sep 17 00:00:00 2001 From: Jason Hiser <jdhiser@gmail.com> Date: Thu, 5 Aug 2021 10:22:25 -0400 Subject: [PATCH] Prevent duplicate loading of plugins if they are in the path twice. --- src/plugin_man.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/plugin_man.cpp b/src/plugin_man.cpp index 1320a6510..59f16ae04 100644 --- a/src/plugin_man.cpp +++ b/src/plugin_man.cpp @@ -212,6 +212,7 @@ void ZiprPluginManager_t::open_plugins ) { const auto ziprPluginDirs=splitVar(getenv("ZIPR_PLUGIN_PATH")); + auto loadedBasenames = set<string>(); for(const auto dir : ziprPluginDirs) { @@ -226,6 +227,15 @@ void ZiprPluginManager_t::open_plugins while ((dirp = readdir(dp)) != nullptr) { const auto basename = string(dirp->d_name); + if(loadedBasenames.find(basename) != loadedBasenames.end()) + { + if (m_verbose) + cout<<"Already loaded "<<basename<<". Skipping..."<<endl; + continue; + + } + loadedBasenames.insert(basename); + const auto name=dir+'/'+basename; const auto zpi=string(".zpi"); const auto extension=name.substr(name.size() - zpi.length()); @@ -239,9 +249,21 @@ void ZiprPluginManager_t::open_plugins cout<<"File ("<<name<<") does not have proper extension, skipping."<<endl; continue; // try next file } + + // test if this library is already loaded, can happen when + // an entry in ZIPR_PLUGIN_PATH is duplicated. + const auto isLoaded = dlopen(name.c_str(), RTLD_LAZY|RTLD_GLOBAL|RTLD_NOLOAD) != nullptr; + if(isLoaded) + { + if (m_verbose) + cout<<"File ("<<name<<") already loaded."<<endl; + continue; + } + if (m_verbose) cout<<"Attempting load of file ("<<name<<")."<<endl; + // actuall load const auto handle=dlopen(name.c_str(), RTLD_LAZY|RTLD_GLOBAL); if(!handle) { -- GitLab