From d0b8a04c8d6801b84b7bd6fd62e921fbb45f0fe2 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Tue, 26 Jul 2011 11:32:09 +1000 Subject: [PATCH] Reference resources to prevent crash (on some platforms) Prevent the data blob from being deleted in done(). Task-number: QTBUG-18268 Change-Id: Ib265e6fc3e1539d0baf20e365c1f88f615b121dc Reviewed-on: http://codereview.qt.nokia.com/2138 Reviewed-by: Aaron Kennedy --- src/declarative/qml/qdeclarativetypeloader.cpp | 2 ++ .../qdeclarativelanguage/data/remoteLoadCrash.qml | 3 +++ .../tst_qdeclarativelanguage.cpp | 16 ++++++++++++++++ 3 files changed, 21 insertions(+), 0 deletions(-) create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/remoteLoadCrash.qml diff --git a/src/declarative/qml/qdeclarativetypeloader.cpp b/src/declarative/qml/qdeclarativetypeloader.cpp index 47c90bd..cb3e8ae 100644 --- a/src/declarative/qml/qdeclarativetypeloader.cpp +++ b/src/declarative/qml/qdeclarativetypeloader.cpp @@ -379,8 +379,10 @@ void QDeclarativeDataBlob::tryDone() m_status = Complete; m_isDone = true; + addref(); done(); notifyAllWaitingOnMe(); + release(); } } diff --git a/tests/auto/declarative/qdeclarativelanguage/data/remoteLoadCrash.qml b/tests/auto/declarative/qdeclarativelanguage/data/remoteLoadCrash.qml new file mode 100644 index 0000000..d96a31f --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/remoteLoadCrash.qml @@ -0,0 +1,3 @@ +import QtQuick 1.0 +Text { +} diff --git a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp index 328b7c8..dfaf3d1 100644 --- a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp +++ b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp @@ -160,6 +160,7 @@ private slots: void revisionOverloads(); void propertyInit(); + void remoteLoadCrash(); // regression tests for crashes void crash1(); @@ -2069,6 +2070,21 @@ void tst_qdeclarativelanguage::registrationOrder() delete o; } +// QTBUG-18268 +void tst_qdeclarativelanguage::remoteLoadCrash() +{ + TestHTTPServer server(14448); + server.serveDirectory(SRCDIR); + + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0; Text {}", QUrl("http://127.0.0.1:14448/data/remoteLoadCrash.qml")); + while (component.isLoading()) + QCoreApplication::processEvents( QEventLoop::ExcludeUserInputEvents | QEventLoop::WaitForMoreEvents, 50); + + QObject *o = component.create(); + delete o; +} + QTEST_MAIN(tst_qdeclarativelanguage) #include "tst_qdeclarativelanguage.moc" -- 1.7.2.5