Prevent QGestureManager crash.

Use QPointer to prevent dereferencing stale pointers
stored in m_gestureTargets.

Add null pointer tests in addition to the Q_ASSERTs
on the pointers returned by m_gestureTargets.value().
The intention is to assert in debug mode but keep
going in release mode.

Change-Id: Icdef8cc02040bddc88f4bcb268e9ca0ac252557d
Task-number: QTBUG-46264
Reviewed-by: Pawel Kurdybacha <pawel.kurdybacha@gmail.com>
Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@theqtcompany.com>
bb10
Morten Johan Sørvig 2015-08-18 11:39:01 +02:00
parent 6f9e845d9b
commit 111ee58c06
2 changed files with 5 additions and 2 deletions

View File

@ -405,6 +405,8 @@ void QGestureManager::cancelGesturesForChildren(QGesture *original)
Q_ASSERT(original);
QWidget *originatingWidget = m_gestureTargets.value(original);
Q_ASSERT(originatingWidget);
if (!originatingWidget)
return;
// iterate over all active gestures and all maybe gestures
// for each find the owner
@ -565,7 +567,8 @@ void QGestureManager::getGestureTargets(const QSet<QGesture*> &gestures,
foreach (QGesture *gesture, gestures) {
QWidget *receiver = m_gestureTargets.value(gesture, 0);
Q_ASSERT(receiver);
gestureByTypes[gesture->gestureType()].insert(receiver, gesture);
if (receiver)
gestureByTypes[gesture->gestureType()].insert(receiver, gesture);
}
// for each gesture type

View File

@ -117,7 +117,7 @@ private:
QHash<QGesture *, QGestureRecognizer *> m_gestureToRecognizer;
QHash<QGesture *, QObject *> m_gestureOwners;
QHash<QGesture *, QWidget *> m_gestureTargets;
QHash<QGesture *, QPointer<QWidget> > m_gestureTargets;
int m_lastCustomGestureId;