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 <fabian.kosmale@qt.io>
This commit is contained in:
Ulf Hermann 2023-02-14 12:24:55 +01:00
parent 93956372d9
commit 6937f2e50d
2 changed files with 15 additions and 0 deletions

View File

@ -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)

View File

@ -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<TestType>("ClearPropertyCaches", 1, 0, "A");
QQmlPropertyCache::ConstPtr oldCache = QQmlMetaType::propertyCache(&TestType::staticMetaObject);
QVERIFY(oldCache);
qmlClearTypeRegistrations();
qmlRegisterType<TestType>("ClearPropertyCaches", 1, 0, "B");
QQmlPropertyCache::ConstPtr newCache = QQmlMetaType::propertyCache(&TestType::staticMetaObject);
QVERIFY(oldCache.data() != newCache.data());
}
QTEST_MAIN(tst_qqmlmetatype)
#include "tst_qqmlmetatype.moc"