From 450343b7b83ba659f6a932092aff922cc1cddd2b Mon Sep 17 00:00:00 2001 From: Vaxry Date: Mon, 22 Apr 2024 15:46:43 +0100 Subject: [PATCH] pluginsystem: unload entire plugin before calling dlclose() fixes #5689 --- src/plugins/PluginSystem.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/plugins/PluginSystem.cpp b/src/plugins/PluginSystem.cpp index 44b4de1f..ae87aedb 100644 --- a/src/plugins/PluginSystem.cpp +++ b/src/plugins/PluginSystem.cpp @@ -119,11 +119,16 @@ void CPluginSystem::unloadPlugin(const CPlugin* plugin, bool eject) { g_pConfigManager->removePluginConfig(plugin->m_pHandle); - dlclose(plugin->m_pHandle); + // save these two for dlclose and a log, + // as erase_if will kill the pointer + const auto PLNAME = plugin->name; + const auto PLHANDLE = plugin->m_pHandle; - Debug::log(LOG, " [PluginSystem] Plugin {} unloaded.", plugin->name); + std::erase_if(m_vLoadedPlugins, [&](const auto& other) { return other->m_pHandle == PLHANDLE; }); - std::erase_if(m_vLoadedPlugins, [&](const auto& other) { return other->m_pHandle == plugin->m_pHandle; }); + dlclose(PLHANDLE); + + Debug::log(LOG, " [PluginSystem] Plugin {} unloaded.", PLNAME); // reload config to fix some stuf like e.g. unloadedPluginVars g_pConfigManager->m_bForceReload = true;