QStateMachine: fix some misleading code

The old code creates a RestorableId from the passed (QObject*, QByteArray)
and used it for lookup in a hash table (ok) and as a container for the
(QObject*, QByteArray), satisfying later references to those parameters
from the RestorableId instance instead of using the parameters directly.

Now, RestorableId holds the QObject* in a QPointer, so the code might have
wanted to detect the object being destroyed as part of the operation, BUT:
a) the operation is a read-only one, and b) the code didn't check for
nullness before dereferencing the QObject*.

Fix by moving the creation of the RestorableId into the scope it's used
and otherwise using the parameters directly.

Change-Id: Iaf12f722fe6841ee1a55037fe33a6115aa699aca
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Marc Mutz 2015-01-08 14:52:01 +01:00
parent 3ecc44d5d2
commit 65eb573926

View File

@ -882,11 +882,10 @@ QVariant QStateMachinePrivate::savedValueForRestorable(const QList<QAbstractStat
#ifdef QSTATEMACHINE_RESTORE_PROPERTIES_DEBUG #ifdef QSTATEMACHINE_RESTORE_PROPERTIES_DEBUG
qDebug() << q_func() << ": savedValueForRestorable(" << exitedStates_sorted << object << propertyName << ")"; qDebug() << q_func() << ": savedValueForRestorable(" << exitedStates_sorted << object << propertyName << ")";
#endif #endif
RestorableId id(object, propertyName);
for (int i = exitedStates_sorted.size() - 1; i >= 0; --i) { for (int i = exitedStates_sorted.size() - 1; i >= 0; --i) {
QAbstractState *s = exitedStates_sorted.at(i); QAbstractState *s = exitedStates_sorted.at(i);
QHash<RestorableId, QVariant> restorables = registeredRestorablesForState.value(s); QHash<RestorableId, QVariant> restorables = registeredRestorablesForState.value(s);
QHash<RestorableId, QVariant>::const_iterator it = restorables.constFind(id); QHash<RestorableId, QVariant>::const_iterator it = restorables.constFind(RestorableId(object, propertyName));
if (it != restorables.constEnd()) { if (it != restorables.constEnd()) {
#ifdef QSTATEMACHINE_RESTORE_PROPERTIES_DEBUG #ifdef QSTATEMACHINE_RESTORE_PROPERTIES_DEBUG
qDebug() << q_func() << ": using" << it.value() << "from" << s; qDebug() << q_func() << ": using" << it.value() << "from" << s;
@ -897,7 +896,7 @@ QVariant QStateMachinePrivate::savedValueForRestorable(const QList<QAbstractStat
#ifdef QSTATEMACHINE_RESTORE_PROPERTIES_DEBUG #ifdef QSTATEMACHINE_RESTORE_PROPERTIES_DEBUG
qDebug() << q_func() << ": falling back to current value"; qDebug() << q_func() << ": falling back to current value";
#endif #endif
return id.first->property(id.second); return object->property(propertyName);
} }
void QStateMachinePrivate::registerRestorable(QAbstractState *state, QObject *object, const QByteArray &propertyName, void QStateMachinePrivate::registerRestorable(QAbstractState *state, QObject *object, const QByteArray &propertyName,