summaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/qdeclarativenotifier.cpp
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2010-03-17 09:07:38 (GMT)
committerAaron Kennedy <aaron.kennedy@nokia.com>2010-03-17 09:08:54 (GMT)
commitd54b11fef6403693de09277a645c9666f8eea6a2 (patch)
tree46b37c15ef196dc7b2b3af6779a22b26340ecb88 /src/declarative/qml/qdeclarativenotifier.cpp
parentfd63689b6202fac71e2b037f70a3ee808ba571ec (diff)
downloadQt-d54b11fef6403693de09277a645c9666f8eea6a2.zip
Qt-d54b11fef6403693de09277a645c9666f8eea6a2.tar.gz
Qt-d54b11fef6403693de09277a645c9666f8eea6a2.tar.bz2
Fix crash
If the notifier gets swapped out during emitting, the endpoint is also invalidated. Thus the "disconnected" writeback must track the endpoint not just the Notifier.
Diffstat (limited to 'src/declarative/qml/qdeclarativenotifier.cpp')
-rw-r--r--src/declarative/qml/qdeclarativenotifier.cpp14
1 files changed, 7 insertions, 7 deletions
diff --git a/src/declarative/qml/qdeclarativenotifier.cpp b/src/declarative/qml/qdeclarativenotifier.cpp
index 8e5904c..b12bf77 100644
--- a/src/declarative/qml/qdeclarativenotifier.cpp
+++ b/src/declarative/qml/qdeclarativenotifier.cpp
@@ -47,23 +47,23 @@ void QDeclarativeNotifier::emitNotify(QDeclarativeNotifierEndpoint *endpoint)
{
QDeclarativeNotifierEndpoint::Notifier *n = endpoint->asNotifier();
- QDeclarativeNotifierEndpoint::Notifier **oldDisconnected = n->disconnected;
- n->disconnected = &n;
+ QDeclarativeNotifierEndpoint **oldDisconnected = n->disconnected;
+ n->disconnected = &endpoint;
if (n->next)
emitNotify(n->next);
- if (n) {
+ if (endpoint) {
void *args[] = { 0 };
QMetaObject::metacall(endpoint->target, QMetaObject::InvokeMetaMethod,
endpoint->targetMethod, args);
- if (n)
- n->disconnected = oldDisconnected;
+ if (endpoint)
+ endpoint->asNotifier()->disconnected = oldDisconnected;
}
- if (oldDisconnected) *oldDisconnected = n;
+ if (oldDisconnected) *oldDisconnected = endpoint;
}
void QDeclarativeNotifierEndpoint::copyAndClear(QDeclarativeNotifierEndpoint &other)
@@ -89,7 +89,7 @@ void QDeclarativeNotifierEndpoint::copyAndClear(QDeclarativeNotifierEndpoint &ot
other_n->notifier = n->notifier;
other_n->disconnected = n->disconnected;
- if (other_n->disconnected) *other_n->disconnected = other_n;
+ if (other_n->disconnected) *other_n->disconnected = &other;
if (n->next) {
other_n->next = n->next;