From 8ef1e1e7a4107f96a526c19bbe25ed6f1654e7ea Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Mon, 18 Aug 2014 12:38:24 +0200 Subject: [PATCH] Protect some members in QQmlObjectCreator Avoid dangling pointers when nested incubators are being used. Task-number: QTBUG-40437 Change-Id: I73922d2f373b2efbc00983305cdea9e8d60f0c41 Reviewed-by: Simon Hausmann --- src/qml/qml/qqmlobjectcreator_p.h | 10 ++++++---- src/qml/qml/qqmlvme.cpp | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/qml/qml/qqmlobjectcreator_p.h b/src/qml/qml/qqmlobjectcreator_p.h index fb4d71d054..73800ca9df 100644 --- a/src/qml/qml/qqmlobjectcreator_p.h +++ b/src/qml/qml/qqmlobjectcreator_p.h @@ -50,6 +50,8 @@ #include #include +#include + QT_BEGIN_NAMESPACE class QQmlAbstractBinding; @@ -63,7 +65,7 @@ struct QQmlObjectCreatorSharedState : public QSharedData QQmlContextData *creationContext; QFiniteStack allCreatedBindings; QFiniteStack allParserStatusCallbacks; - QFiniteStack allCreatedObjects; + QFiniteStack > allCreatedObjects; QV4::Value *allJavaScriptObjects; // pointer to vector on JS stack to reference JS wrappers during creation phase. QQmlComponentAttached *componentAttached; QList finalizeCallbacks; @@ -89,8 +91,8 @@ public: QList errors; - QQmlContextData *parentContextData() const { return parentContext; } - QFiniteStack &allCreatedObjects() const { return sharedState->allCreatedObjects; } + QQmlContextData *parentContextData() { return parentContext.contextData(); } + QFiniteStack > &allCreatedObjects() const { return sharedState->allCreatedObjects; } private: QQmlObjectCreator(QQmlContextData *contextData, QQmlCompiledData *compiledData, QQmlObjectCreatorSharedState *inheritedSharedState); @@ -123,7 +125,7 @@ private: QQmlEngine *engine; QQmlCompiledData *compiledData; const QV4::CompiledData::QmlUnit *qmlUnit; - QQmlContextData *parentContext; + QQmlGuardedContextData parentContext; QQmlContextData *context; const QHash &resolvedTypes; const QVector &propertyCaches; diff --git a/src/qml/qml/qqmlvme.cpp b/src/qml/qml/qqmlvme.cpp index 56befa4a3e..8958d5cec6 100644 --- a/src/qml/qml/qqmlvme.cpp +++ b/src/qml/qml/qqmlvme.cpp @@ -113,7 +113,7 @@ void QQmlVMEGuard::guard(QQmlObjectCreator *creator) { clear(); - QFiniteStack &objects = creator->allCreatedObjects(); + QFiniteStack > &objects = creator->allCreatedObjects(); m_objectCount = objects.count(); m_objects = new QPointer[m_objectCount]; for (int ii = 0; ii < m_objectCount; ++ii)