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