summaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/qdeclarativenotifier.cpp
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2010-03-17 19:07:38 +1000
committerAaron Kennedy <aaron.kennedy@nokia.com>2010-03-17 19:08:54 +1000
commitd54b11fef6403693de09277a645c9666f8eea6a2 (patch)
tree46b37c15ef196dc7b2b3af6779a22b26340ecb88 /src/declarative/qml/qdeclarativenotifier.cpp
parentfd63689b6202fac71e2b037f70a3ee808ba571ec (diff)
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 8e5904ce0c..b12bf77201 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;