From 73f04262bec711650bc6049b69cb75236d192c57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Fri, 30 Jan 2026 00:35:34 -0300 Subject: [PATCH] Fix user-after-free during plugin reload. --- src/tools/ecode/plugins/aiassistant/aiassistantplugin.cpp | 2 ++ src/tools/ecode/plugins/pluginmanager.cpp | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/tools/ecode/plugins/aiassistant/aiassistantplugin.cpp b/src/tools/ecode/plugins/aiassistant/aiassistantplugin.cpp index fa2959bfd..b3252adaa 100644 --- a/src/tools/ecode/plugins/aiassistant/aiassistantplugin.cpp +++ b/src/tools/ecode/plugins/aiassistant/aiassistantplugin.cpp @@ -143,6 +143,8 @@ AIAssistantPlugin::~AIAssistantPlugin() { waitUntilLoaded(); mShuttingDown = true; + unsubscribeFileSystemListener(); + if ( mAIChatButton ) { if ( mAIChatButtonPosCbId ) mAIChatButton->getParent()->removeEventListener( mAIChatButtonPosCbId ); diff --git a/src/tools/ecode/plugins/pluginmanager.cpp b/src/tools/ecode/plugins/pluginmanager.cpp index a4890186f..e0dda9fb5 100644 --- a/src/tools/ecode/plugins/pluginmanager.cpp +++ b/src/tools/ecode/plugins/pluginmanager.cpp @@ -313,8 +313,12 @@ void PluginManager::subscribeFileSystemListener() { mFileSystemListenerCb = mFileSystemListener->addListener( [this]( const FileEvent& ev, const FileInfo& file ) { - Lock l( mPluginsFSSubsMutex ); - for ( Plugin* plugin : mPluginsFSSubs ) + UnorderedSet plugins; + { + Lock l( mPluginsFSSubsMutex ); + plugins = mPluginsFSSubs; + } + for ( Plugin* plugin : plugins ) plugin->onFileSystemEvent( ev, file ); } ); }