diff options
| author | Méven Car <[email protected]> | 2024-03-23 11:55:37 +0100 |
|---|---|---|
| committer | Méven Car <[email protected]> | 2024-03-24 11:55:54 +0100 |
| commit | d270700c0ef42b6f1e1bef09bbf0bab59b3e78d1 (patch) | |
| tree | 9e3949119321c9e99e602c0b97f77290a648789a /src/views | |
| parent | 5795d57dcb601b154a8856df56c2fcab02b6b0f4 (diff) | |
versioncontrol: Prevent a use-after-free in UpdateItemStatesThread
UpdateItemStatesThread kept a pointer reference to m_plugin whose
lifetime was tied to VersionControlObserver parents.
On application shutdown it could happen the thread is still running when
the Observer is destroyed.
Make the plugin pointer a weak reference, allowing to stop the thread
when the plugin is gone.
BUG: 477425
Diffstat (limited to 'src/views')
| -rw-r--r-- | src/views/versioncontrol/updateitemstatesthread.cpp | 12 | ||||
| -rw-r--r-- | src/views/versioncontrol/updateitemstatesthread.h | 3 |
2 files changed, 10 insertions, 5 deletions
diff --git a/src/views/versioncontrol/updateitemstatesthread.cpp b/src/views/versioncontrol/updateitemstatesthread.cpp index ad53517ae..e6a0f68fa 100644 --- a/src/views/versioncontrol/updateitemstatesthread.cpp +++ b/src/views/versioncontrol/updateitemstatesthread.cpp @@ -26,22 +26,26 @@ UpdateItemStatesThread::~UpdateItemStatesThread() void UpdateItemStatesThread::run() { Q_ASSERT(!m_itemStates.isEmpty()); - Q_ASSERT(m_plugin); + if (!m_plugin) { + return; + } QMutexLocker pluginLocker(m_globalPluginMutex); QMap<QString, QVector<VersionControlObserver::ItemState>>::iterator it = m_itemStates.begin(); - for (; it != m_itemStates.end(); ++it) { + for (; it != m_itemStates.end() && m_plugin; ++it) { if (m_plugin->beginRetrieval(it.key())) { QVector<VersionControlObserver::ItemState> &items = it.value(); const int count = items.count(); - for (int i = 0; i < count; ++i) { + for (int i = 0; i < count && m_plugin; ++i) { const KFileItem &item = items.at(i).first; const KVersionControlPlugin::ItemVersion version = m_plugin->itemVersion(item); items[i].second = version; } } - m_plugin->endRetrieval(); + if (m_plugin) { + m_plugin->endRetrieval(); + } } } diff --git a/src/views/versioncontrol/updateitemstatesthread.h b/src/views/versioncontrol/updateitemstatesthread.h index 24f060d26..550436010 100644 --- a/src/views/versioncontrol/updateitemstatesthread.h +++ b/src/views/versioncontrol/updateitemstatesthread.h @@ -11,6 +11,7 @@ #include "views/versioncontrol/versioncontrolobserver.h" #include <QMutex> +#include <QPointer> #include <QThread> /** @@ -41,7 +42,7 @@ protected: private: QMutex *m_globalPluginMutex; // Protects the m_plugin globally - KVersionControlPlugin *m_plugin; + QPointer<KVersionControlPlugin> m_plugin; QMap<QString, QVector<VersionControlObserver::ItemState>> m_itemStates; }; |
