From 6d1e5f56a6e04f2ef4128048e44d2cdeb0cbff1d Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Mon, 7 Mar 2022 19:31:48 +0200 Subject: [PATCH] lock before accessing global QML plugins map Signed-off-by: Ivailo Monev --- src/declarative/qml/qdeclarativeimport.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/declarative/qml/qdeclarativeimport.cpp b/src/declarative/qml/qdeclarativeimport.cpp index d5985700d..b9976b352 100644 --- a/src/declarative/qml/qdeclarativeimport.cpp +++ b/src/declarative/qml/qdeclarativeimport.cpp @@ -44,6 +44,7 @@ static bool greaterThan(const QString &s1, const QString &s2) } typedef QMap StringStringMap; +Q_GLOBAL_STATIC(QMutex, qmlEnginePluginsWithRegisteredTypesMutex) Q_GLOBAL_STATIC(StringStringMap, qmlEnginePluginsWithRegisteredTypes) // stores the uri class QDeclarativeImportedNamespace @@ -897,6 +898,7 @@ bool QDeclarativeImportDatabase::importPlugin(const QString &filePath, const QSt QFileInfo fileInfo(filePath); const QString absoluteFilePath = fileInfo.absoluteFilePath(); + QMutexLocker locker(qmlEnginePluginsWithRegisteredTypesMutex()); bool engineInitialized = initializedPlugins.contains(absoluteFilePath); bool typesRegistered = qmlEnginePluginsWithRegisteredTypes()->contains(absoluteFilePath); @@ -917,20 +919,17 @@ bool QDeclarativeImportDatabase::importPlugin(const QString &filePath, const QSt if (QDeclarativeExtensionInterface *iface = qobject_cast(loader.instance())) { - const QByteArray bytes = uri.toUtf8(); - const char *moduleId = bytes.constData(); + const QByteArray moduleId = uri.toUtf8(); if (!typesRegistered) { - - // ### this code should probably be protected with a mutex. qmlEnginePluginsWithRegisteredTypes()->insert(absoluteFilePath, uri); - iface->registerTypes(moduleId); + iface->registerTypes(moduleId.constData()); } if (!engineInitialized) { // things on the engine (eg. adding new global objects) have to be done for every engine. // protect against double initialization initializedPlugins.insert(absoluteFilePath); - iface->initializeEngine(engine, moduleId); + iface->initializeEngine(engine, moduleId.constData()); } } else { if (errorString)