diff options
author | Alan Alpert <aalpert@blackberry.com> | 2013-03-27 14:08:28 -0700 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-05-04 06:26:14 +0200 |
commit | 209c87d2bc188ee0f5be6b9562593169740eaddb (patch) | |
tree | 016beaa0dda0968ac5293856e9361ac7797754a7 /src/qml/qml/qqmlmetatype.cpp | |
parent | ad5ae0d751e42a9ca6def5d98b2db740f195c16f (diff) |
Avoid rare crash
In the case where a QML type had been registered with the same
metaobject, you could dereference the c++ type union data when it hadn't
been allocated.
Change-Id: I906d68710cf88b379933eb13cf0668738f07d5f4
Reviewed-by: Matthew Vogt <matthew.vogt@qinetic.com.au>
Diffstat (limited to 'src/qml/qml/qqmlmetatype.cpp')
-rw-r--r-- | src/qml/qml/qqmlmetatype.cpp | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/src/qml/qml/qqmlmetatype.cpp b/src/qml/qml/qqmlmetatype.cpp index 372475d85c..0f3a27aeff 100644 --- a/src/qml/qml/qqmlmetatype.cpp +++ b/src/qml/qml/qqmlmetatype.cpp @@ -582,16 +582,18 @@ void QQmlTypePrivate::init() const while(mo) { QQmlType *t = metaTypeData()->metaObjectToType.value(mo); if (t) { - if (t->d->extraData.cd->extFunc) { - QMetaObjectBuilder builder; - clone(builder, t->d->extraData.cd->extMetaObject, t->d->baseMetaObject, baseMetaObject); - builder.setFlags(QMetaObjectBuilder::DynamicMetaObject); - QMetaObject *mmo = builder.toMetaObject(); - mmo->d.superdata = baseMetaObject; - if (!metaObjects.isEmpty()) - metaObjects.last().metaObject->d.superdata = mmo; - QQmlProxyMetaObject::ProxyData data = { mmo, t->d->extraData.cd->extFunc, 0, 0 }; - metaObjects << data; + if (t->d->regType == QQmlType::CppType) { + if (t->d->extraData.cd->extFunc) { + QMetaObjectBuilder builder; + clone(builder, t->d->extraData.cd->extMetaObject, t->d->baseMetaObject, baseMetaObject); + builder.setFlags(QMetaObjectBuilder::DynamicMetaObject); + QMetaObject *mmo = builder.toMetaObject(); + mmo->d.superdata = baseMetaObject; + if (!metaObjects.isEmpty()) + metaObjects.last().metaObject->d.superdata = mmo; + QQmlProxyMetaObject::ProxyData data = { mmo, t->d->extraData.cd->extFunc, 0, 0 }; + metaObjects << data; + } } } mo = mo->d.superdata; |