diff options
author | hjk <hjk@qt.io> | 2020-08-13 13:03:17 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2020-08-25 09:48:03 +0000 |
commit | fff3b4183349f84f9f68dc7712fdd73c6b2111e7 (patch) | |
tree | 098d35df68ed59f87d4ddcc2fb4a46e5c9064cb2 | |
parent | 5cece408de8c9141c36acf921db8afcc5f0a5376 (diff) |
QmlDesigner: Fix UB in QmlPreviewPlugin::getPreviewPlugin()v4.13.0
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 <eike.ziller@qt.io>
-rw-r--r-- | src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewplugin.cpp | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewplugin.cpp b/src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewplugin.cpp index aa6b0e85652..ac0f30118d5 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<ExtensionSystem::PluginSpec *> 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; |