From 6937f2e50dd60c58350a464eb83ba9d11c7146f9 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Tue, 14 Feb 2023 12:24:55 +0100 Subject: [PATCH] QQmlMetaType: Clear property caches on qmlClearTypeRegistrations Otherwise we may retain dangling pointers referencing invalid property caches. Some metaobjects are created on the heap. If the memory manager decides to re-use the heap space for new metaobjects, we can retrieve the invalid property caches. Pick-to: 6.5 6.4 6.2 Task-number: QTBUG-110933 Change-Id: Ic00bb852151bcf58ba6ae798a6bf2cea686a9e10 Reviewed-by: Fabian Kosmale --- src/qml/qml/qqmlmetatype.cpp | 1 + tests/auto/qml/qqmlmetatype/tst_qqmlmetatype.cpp | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/qml/qml/qqmlmetatype.cpp b/src/qml/qml/qqmlmetatype.cpp index 054ad48617..e15ba1e6a9 100644 --- a/src/qml/qml/qqmlmetatype.cpp +++ b/src/qml/qml/qqmlmetatype.cpp @@ -317,6 +317,7 @@ void QQmlMetaType::clearTypeRegistrations() data->urlToNonFileImportType.clear(); data->metaObjectToType.clear(); data->undeletableTypes.clear(); + data->propertyCaches.clear(); } int QQmlMetaType::registerAutoParentFunction(const QQmlPrivate::RegisterAutoParent &function) diff --git a/tests/auto/qml/qqmlmetatype/tst_qqmlmetatype.cpp b/tests/auto/qml/qqmlmetatype/tst_qqmlmetatype.cpp index c1bac33d87..a185f1776f 100644 --- a/tests/auto/qml/qqmlmetatype/tst_qqmlmetatype.cpp +++ b/tests/auto/qml/qqmlmetatype/tst_qqmlmetatype.cpp @@ -51,6 +51,8 @@ private slots: void enumsInRecursiveImport(); void revertValueTypeAnimation(); + + void clearPropertyCaches(); }; class TestType : public QObject @@ -724,6 +726,18 @@ void tst_qqmlmetatype::revertValueTypeAnimation() QCOMPARE(o->property("pointSize").toDouble(), 12.0); } +void tst_qqmlmetatype::clearPropertyCaches() +{ + qmlClearTypeRegistrations(); + qmlRegisterType("ClearPropertyCaches", 1, 0, "A"); + QQmlPropertyCache::ConstPtr oldCache = QQmlMetaType::propertyCache(&TestType::staticMetaObject); + QVERIFY(oldCache); + qmlClearTypeRegistrations(); + qmlRegisterType("ClearPropertyCaches", 1, 0, "B"); + QQmlPropertyCache::ConstPtr newCache = QQmlMetaType::propertyCache(&TestType::staticMetaObject); + QVERIFY(oldCache.data() != newCache.data()); +} + QTEST_MAIN(tst_qqmlmetatype) #include "tst_qqmlmetatype.moc"