Fixed crash on destruction of animating QDockWidget in a QMainWindow
authorRohan McGovern <rohan.mcgovern@nokia.com>
Mon, 22 Oct 2012 04:19:24 +0000 (14:19 +1000)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Thu, 25 Oct 2012 10:18:15 +0000 (12:18 +0200)
It doesn't make sense to hold an unguarded pointer to a
QPropertyAnimation while assigning ownership of that animation to the
animated widget.

Destruction of the widget while the animation is in progress causes
the animation pointer to become dangling; then the widget is removed
from the containing QMainWindowLayout, which attempts to abort the
animation, dereferencing the invalid pointer.

The crash can be reproduced sometimes with
tst_QDockWidget::taskQTBUG_2940_resizeAfterUndocking (which is in
Qt4 only).

Change-Id: I758bf7193b2ea39cd4d8e87197d8ff957d3368eb
Reviewed-by: Robin Burchell <robin+qt@viroteck.net>
Reviewed-by: Andy Shaw <andy.shaw@digia.com>
src/widgets/widgets/qwidgetanimator.cpp
src/widgets/widgets/qwidgetanimator_p.h

index edd9d63..aef967b 100644 (file)
@@ -59,7 +59,9 @@ void QWidgetAnimator::abort(QWidget *w)
         return;
     QPropertyAnimation *anim = *it;
     m_animation_map.erase(it);
-    anim->stop();
+    if (anim) {
+        anim->stop();
+    }
 #ifndef QT_NO_MAINWINDOW
     m_mainWindowLayout->animationFinished(w);
 #endif
index 5649488..98963ce 100644 (file)
@@ -55,6 +55,7 @@
 
 #include <qobject.h>
 #include <qhash.h>
+#include <qpointer.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -79,7 +80,7 @@ private Q_SLOTS:
 #endif
 
 private:
-    typedef QHash<QWidget*, QPropertyAnimation*> AnimationMap;
+    typedef QHash<QWidget*, QPointer<QPropertyAnimation> > AnimationMap;
     AnimationMap m_animation_map;
     QMainWindowLayout *m_mainWindowLayout;
 };