Commit 9321a196 authored by Martin Jones's avatar Martin Jones Committed by Qt by Nokia
Browse files

Deleting an incubated object after setInitialState() crashes


Incubating objects are often parented in setInitialState(), which
can lead to the incubating object being deleted after object creation,
but before completion.  When incubator.clear() is called after
this point, it would attempt to delete the already deleted
object. This change guards the incubation object in the incubator.

Change-Id: I9585e93027250b8b6b3f1777b10ee1008ae7b818
Reviewed-by: default avatarGlenn Watson <glenn.watson@nokia.com>
parent a782a3e5
dev 5.10 5.11 5.12 5.12.1 5.12.10 5.12.11 5.12.12 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13 5.13.0 5.13.1 5.13.2 5.14 5.14.0 5.14.1 5.14.2 5.15 5.15.0 5.15.1 5.15.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.9.8 6.0 6.0.0 6.1 6.1.0 6.1.1 6.1.2 6.1.3 6.2 6.2.0 6.2.1 6.2.2 old/5.0 old/5.1 old/5.2 wip/animation-refactor wip/cmake wip/dbus wip/gc wip/itemviews wip/nacl wip/new-backend wip/pointerhandler wip/propertycache-refactor wip/qquickdeliveryagent wip/scenegraphng wip/tizen wip/webassembly v5.15.0-alpha1 v5.14.1 v5.14.0 v5.14.0-rc2 v5.14.0-rc1 v5.14.0-beta3 v5.14.0-beta2 v5.14.0-beta1 v5.14.0-alpha1 v5.13.2 v5.13.1 v5.13.0 v5.13.0-rc3 v5.13.0-rc2 v5.13.0-rc1 v5.13.0-beta4 v5.13.0-beta3 v5.13.0-beta2 v5.13.0-beta1 v5.13.0-alpha1 v5.12.7 v5.12.6 v5.12.5 v5.12.4 v5.12.3 v5.12.2 v5.12.1 v5.12.0 v5.12.0-rc2 v5.12.0-rc1 v5.12.0-beta4 v5.12.0-beta3 v5.12.0-beta2 v5.12.0-beta1 v5.12.0-alpha1 v5.11.3 v5.11.2 v5.11.1 v5.11.0 v5.11.0-rc2 v5.11.0-rc1 v5.11.0-beta4 v5.11.0-beta3 v5.11.0-beta2 v5.11.0-beta1 v5.11.0-alpha1 v5.10.1 v5.10.0 v5.10.0-rc3 v5.10.0-rc2 v5.10.0-rc1 v5.10.0-beta4 v5.10.0-beta3 v5.10.0-beta2 v5.10.0-beta1 v5.10.0-alpha1 v5.9.9 v5.9.8 v5.9.7 v5.9.6 v5.9.5 v5.9.4 v5.9.3 v5.9.2 v5.9.1 v5.9.0 v5.9.0-rc2 v5.9.0-rc1 v5.9.0-beta4 v5.9.0-beta3 v5.9.0-beta2 v5.9.0-beta1 v5.9.0-alpha1 v5.8.0 v5.8.0-rc1 v5.8.0-beta1 v5.8.0-alpha1 v5.7.1 v5.7.0 v5.7.0-rc1 v5.7.0-beta1 v5.7.0-alpha1 v5.6.3 v5.6.2 v5.6.1 v5.6.1-1 v5.6.0 v5.6.0-rc1 v5.6.0-beta1 v5.6.0-alpha1 v5.5.1 v5.5.0 v5.5.0-rc1 v5.5.0-beta1 v5.5.0-alpha1 v5.4.2 v5.4.1 v5.4.0 v5.4.0-rc1 v5.4.0-beta1 v5.4.0-alpha1 v5.3.2 v5.3.1 v5.3.0 v5.3.0-rc1 v5.3.0-beta1 v5.3.0-alpha1 v5.2.1 v5.2.0 v5.2.0-rc1 v5.2.0-beta1 v5.2.0-alpha1 v5.1.1 v5.1.0 v5.1.0-rc2 v5.1.0-rc1 v5.1.0-beta1 v5.1.0-alpha1 v5.0.2 v5.0.1 v5.0.0 v5.0.0-rc2 v5.0.0-rc1 v5.0.0-beta2 v5.0.0-beta1 qt-v5.0.0-alpha1
No related merge requests found
Showing with 38 additions and 1 deletion
......@@ -83,7 +83,7 @@ public:
enum Progress { Execute, Completing, Completed };
Progress progress;
QObject *result;
QDeclarativeGuard<QObject> result;
QDeclarativeGuardedContextData rootContext;
QDeclarativeCompiledData *component;
QDeclarativeVME vme;
......
......@@ -79,6 +79,7 @@ private slots:
void forceCompletion();
void setInitialState();
void clearDuringCompletion();
void objectDeletionAfterInit();
void recursiveClear();
void statusChanged();
void asynchronousIfNested();
......@@ -434,6 +435,42 @@ void tst_qdeclarativeincubator::clearDuringCompletion()
QVERIFY(srt.isNull());
}
void tst_qdeclarativeincubator::objectDeletionAfterInit()
{
QDeclarativeComponent component(&engine, TEST_FILE("clear.qml"));
QVERIFY(component.isReady());
struct MyIncubator : public QDeclarativeIncubator
{
MyIncubator(QDeclarativeIncubator::IncubationMode mode)
: QDeclarativeIncubator(mode), obj(0) {}
virtual void setInitialState(QObject *o) {
obj = o;
}
QObject *obj;
};
SelfRegisteringType::clearMe();
MyIncubator incubator(QDeclarativeIncubator::Asynchronous);
component.create(incubator);
while (!incubator.obj && incubator.isLoading()) {
bool b = false;
controller.incubateWhile(&b);
}
QVERIFY(incubator.isLoading());
QVERIFY(SelfRegisteringType::me() != 0);
delete incubator.obj;
incubator.clear();
QCoreApplication::processEvents(QEventLoop::DeferredDeletion);
QVERIFY(incubator.isNull());
}
class Switcher : public QObject
{
Q_OBJECT
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment