From fff3b4183349f84f9f68dc7712fdd73c6b2111e7 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 13 Aug 2020 13:03:17 +0200 Subject: QmlDesigner: Fix UB in QmlPreviewPlugin::getPreviewPlugin() Each call to PluginManager::plugins() creates a new QVector object, iterators are only comparable for iterators from the same vector. It worked in practice because the underlying storage was the same here as the QVector objects were only shallow copies. Change-Id: I2e276535942bd949acf91e12873c7bdf9d5c34d6 Reviewed-by: Eike Ziller --- src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewplugin.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewplugin.cpp b/src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewplugin.cpp index aa6b0e8565..ac0f30118d 100644 --- a/src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewplugin.cpp +++ b/src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewplugin.cpp @@ -158,13 +158,15 @@ void QmlPreviewPlugin::setLanguageLocale(const QString &locale) QObject *QmlPreviewPlugin::getPreviewPlugin() { - auto pluginIt = std::find_if(ExtensionSystem::PluginManager::plugins().begin(), - ExtensionSystem::PluginManager::plugins().end(), + const QVector specs = ExtensionSystem::PluginManager::plugins(); + + auto pluginIt = std::find_if(specs.begin(), + specs.end(), [](const ExtensionSystem::PluginSpec *p) { return p->name() == "QmlPreview"; }); - if (pluginIt != ExtensionSystem::PluginManager::plugins().constEnd()) + if (pluginIt != specs.end()) return (*pluginIt)->plugin(); return nullptr; -- cgit v1.2.3