[kdebase-workspace] Crash in TaskManager::TaskItem::task (kde#272495) Crashes When Adding Weather Widgets (Geolocation)

Rex Dieter rdieter at fedoraproject.org
Thu Nov 17 16:20:06 UTC 2011


commit 8decc0d3e831b6297fc9ad3c7c4273d326319859
Author: Rex Dieter <rdieter at fedoraproject.org>
Date:   Thu Nov 17 10:20:50 2011 -0600

    Crash in TaskManager::TaskItem::task (kde#272495)
    Crashes When Adding Weather Widgets (Geolocation) (kde#277036)

 kde-workspace-4.7.3-kdebug272495.patch |  264 ++++++++++++++++++++++++++++++++
 kde-workspace-4.7.3-kdebug277036.patch |   17 ++
 kdebase-workspace.spec                 |   12 ++-
 3 files changed, 292 insertions(+), 1 deletions(-)
---
diff --git a/kde-workspace-4.7.3-kdebug272495.patch b/kde-workspace-4.7.3-kdebug272495.patch
new file mode 100644
index 0000000..3f45277
--- /dev/null
+++ b/kde-workspace-4.7.3-kdebug272495.patch
@@ -0,0 +1,264 @@
+commit 639155a5493a28ca9460d60fa0c078ec65c3bb96
+Author: Aaron Seigo <aseigo at kde.org>
+Date:   Thu Nov 10 13:01:37 2011 +0100
+
+    use a QWeakPointer to track the lifespan of the task
+    
+    the itemRemoved signal from TaskGroup has dangling pointers, apparently
+    by design (the next thing on my list to investigate), and the signal is
+    delayed. so between the actual deletion of the task and the signal, there
+    pointer is a dangler. easy solution is to just track it in the WindowTaskItem
+    itself with a cheap QWeakPointer.
+    
+    BUG:272495
+
+diff --git a/plasma/desktop/applets/tasks/abstracttaskitem.cpp b/plasma/desktop/applets/tasks/abstracttaskitem.cpp
+index 00140ef..48ba172 100644
+--- a/plasma/desktop/applets/tasks/abstracttaskitem.cpp
++++ b/plasma/desktop/applets/tasks/abstracttaskitem.cpp
+@@ -203,6 +203,10 @@ QIcon AbstractTaskItem::icon() const
+     return QIcon();
+ }
+ 
++void AbstractTaskItem::close()
++{
++}
++
+ void AbstractTaskItem::setTaskFlags(const TaskFlags flags)
+ {
+     if (((m_flags & TaskWantsAttention) != 0) != ((flags & TaskWantsAttention) != 0)) {
+diff --git a/plasma/desktop/applets/tasks/abstracttaskitem.h b/plasma/desktop/applets/tasks/abstracttaskitem.h
+index 9520e1f..a527881 100644
+--- a/plasma/desktop/applets/tasks/abstracttaskitem.h
++++ b/plasma/desktop/applets/tasks/abstracttaskitem.h
+@@ -103,7 +103,7 @@ public:
+     /** Returns the current icon for this task. */
+     QIcon icon() const;
+ 
+-    virtual void close() = 0;
++    virtual void close();
+ 
+     /** Tells the window manager the minimized task's geometry. */
+     virtual void publishIconGeometry() const;
+diff --git a/plasma/desktop/applets/tasks/windowtaskitem.cpp b/plasma/desktop/applets/tasks/windowtaskitem.cpp
+index 1ddca2c..1c33476 100644
+--- a/plasma/desktop/applets/tasks/windowtaskitem.cpp
++++ b/plasma/desktop/applets/tasks/windowtaskitem.cpp
+@@ -56,7 +56,6 @@
+ 
+ WindowTaskItem::WindowTaskItem(QGraphicsWidget *parent, Tasks *applet)
+     : AbstractTaskItem(parent, applet),
+-      m_task(0),
+       m_busyWidget(0)
+ {
+ }
+@@ -77,8 +76,8 @@ void WindowTaskItem::activate()
+     // in a widget such as a line edit which does accept the focus)
+     // this needs to be implemented for Plasma's own panels.
+     //kDebug();
+-    if (m_task && m_task->task()) {
+-        m_task->task()->activateRaiseOrIconify();
++    if (m_task && m_task.data()->task()) {
++        m_task.data()->task()->activateRaiseOrIconify();
+        // emit windowSelected(this);
+     }
+ }
+@@ -108,27 +107,20 @@ void WindowTaskItem::keyPressEvent(QKeyEvent *event)
+     }
+ }
+ 
+-//destroy this item
+-void WindowTaskItem::close()
+-{
+-    //kDebug();
+-    m_task = 0;
+-}
+-
+ void WindowTaskItem::publishIconGeometry() const
+ {
+-    if (!m_task || !m_task->task()) {
++    if (!m_task || !m_task.data()->task()) {
+         return;
+     }
+ 
+     QRect rect = iconGeometry();
+-    m_task->task()->publishIconGeometry(rect);
++    m_task.data()->task()->publishIconGeometry(rect);
+ }
+ 
+ void WindowTaskItem::publishIconGeometry(const QRect &rect) const
+ {
+-    if (m_task && m_task->task()) {
+-        m_task->task()->publishIconGeometry(rect);
++    if (m_task && m_task.data()->task()) {
++        m_task.data()->task()->publishIconGeometry(rect);
+     }
+ }
+ 
+@@ -142,7 +134,7 @@ void WindowTaskItem::updateTask(::TaskManager::TaskChanges changes)
+     TaskFlags flags = m_flags;
+ 
+     if (changes & TaskManager::StateChanged) {
+-        if (m_task->isActive()) {
++        if (m_task.data()->isActive()) {
+             flags |= TaskHasFocus;
+             if (!(m_flags & TaskHasFocus)) {
+                 emit activated(this);
+@@ -151,7 +143,7 @@ void WindowTaskItem::updateTask(::TaskManager::TaskChanges changes)
+             flags &= ~TaskHasFocus;
+         }
+ 
+-        if (m_task->isMinimized()) {
++        if (m_task.data()->isMinimized()) {
+             flags |= TaskIsMinimized;
+         } else {
+             flags &= ~TaskIsMinimized;
+@@ -160,7 +152,7 @@ void WindowTaskItem::updateTask(::TaskManager::TaskChanges changes)
+     }
+ 
+     if (changes & TaskManager::AttentionChanged) {
+-        if (m_task->demandsAttention()) {
++        if (m_task.data()->demandsAttention()) {
+             flags |= TaskWantsAttention;
+         } else {
+             flags &= ~TaskWantsAttention;
+@@ -191,14 +183,14 @@ void WindowTaskItem::updateTask(::TaskManager::TaskChanges changes)
+ 
+     if (needsUpdate) {
+         //redraw
+-        //kDebug() << m_task->name();
++        //kDebug() << m_task.data()->name();
+         queueUpdate();
+     }
+ }
+ 
+ void WindowTaskItem::updateToolTip()
+ {
+-    if (!m_task || !m_task->task()) {
++    if (!m_task || !m_task.data()->task()) {
+         return;
+     }
+ 
+@@ -219,19 +211,19 @@ void WindowTaskItem::updateToolTip()
+     }
+ 
+     if (showToolTip) {
+-        QPixmap p = m_task->task()->icon(KIconLoader::SizeLarge, KIconLoader::SizeLarge, false);
++        QPixmap p = m_task.data()->task()->icon(KIconLoader::SizeLarge, KIconLoader::SizeLarge, false);
+         if (p.height() > KIconLoader::SizeLarge) {
+             p = p.scaled(QSize(KIconLoader::SizeLarge, KIconLoader::SizeLarge),
+                                 Qt::KeepAspectRatio, Qt::SmoothTransformation);
+         }
+ 
+-        Plasma::ToolTipContent data(Qt::escape(m_task->name()), QString(), p);
+-        if (m_task->desktop() != 0 && 
+-            (!m_applet->groupManager().showOnlyCurrentDesktop() || !m_task->isOnCurrentDesktop())) {
++        Plasma::ToolTipContent data(Qt::escape(m_task.data()->name()), QString(), p);
++        if (m_task.data()->desktop() != 0 && 
++            (!m_applet->groupManager().showOnlyCurrentDesktop() || !m_task.data()->isOnCurrentDesktop())) {
+             data.setSubText(i18nc("Which virtual desktop a window is currently on", "On %1",
+-                                  KWindowSystem::desktopName(m_task->desktop())));
++                                  KWindowSystem::desktopName(m_task.data()->desktop())));
+         }
+-        data.setWindowToPreview(m_task->task()->window());
++        data.setWindowsToPreview(QList<WId>() << m_task.data()->task()->window());
+         data.setClickable(true);
+         data.setInstantPopup(true);
+         data.setHighlightWindows(m_applet->highlightWindows());
+@@ -285,8 +277,9 @@ void WindowTaskItem::gotTaskPointer()
+ void WindowTaskItem::setWindowTask(TaskManager::TaskItem* taskItem)
+ {
+     if (m_task) {
+-        disconnect(m_task->task().constData(), 0, this, 0);
++        disconnect(m_task.data()->task().constData(), 0, this, 0);
+     }
++
+     m_task = taskItem;
+     m_abstractItem = qobject_cast<TaskManager::AbstractGroupableItem *>(taskItem);
+ 
+@@ -294,8 +287,10 @@ void WindowTaskItem::setWindowTask(TaskManager::TaskItem* taskItem)
+         connect(m_abstractItem, SIGNAL(destroyed(QObject*)), this, SLOT(clearAbstractItem()));
+     }
+ 
+-    connect(m_task, SIGNAL(changed(::TaskManager::TaskChanges)),
+-            this, SLOT(updateTask(::TaskManager::TaskChanges)));
++    if (m_task) {
++        connect(m_task.data(), SIGNAL(changed(::TaskManager::TaskChanges)),
++                this, SLOT(updateTask(::TaskManager::TaskChanges)));
++    }
+ 
+     updateTask(::TaskManager::EverythingChanged);
+     publishIconGeometry();
+@@ -319,7 +314,7 @@ void WindowTaskItem::setTask(TaskManager::TaskItem* taskItem)
+ 
+ TaskManager::TaskPtr WindowTaskItem::windowTask() const
+ {
+-    return m_task ? m_task->task() : TaskManager::TaskPtr();
++    return m_task ? m_task.data()->task() : TaskManager::TaskPtr();
+ }
+ 
+ void WindowTaskItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *e)
+@@ -331,10 +326,10 @@ void WindowTaskItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *e)
+ 
+     QList <QAction*> actionList;
+     QAction *a(0);
+-    if (m_task->isGrouped()) {
++    if (m_task.data()->isGrouped()) {
+         a = new QAction(i18n("Collapse Parent Group"), 0);
+         actionList.append(a);
+-        TaskGroupItem *group = qobject_cast<TaskGroupItem*>(m_applet->rootGroupItem()->abstractTaskItem(m_task->parentGroup()));
++        TaskGroupItem *group = qobject_cast<TaskGroupItem*>(m_applet->rootGroupItem()->abstractTaskItem(m_task.data()->parentGroup()));
+         connect(a, SIGNAL(triggered()), group, SLOT(collapse()));
+     }
+ 
+@@ -343,7 +338,7 @@ void WindowTaskItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *e)
+         actionList.append(configAction);
+     }
+ 
+-    TaskManager::BasicMenu menu(0, m_task, &m_applet->groupManager(), actionList);
++    TaskManager::BasicMenu menu(0, m_task.data(), &m_applet->groupManager(), actionList);
+     menu.adjustSize();
+ 
+     if (m_applet->formFactor() != Plasma::Vertical) {
+@@ -364,18 +359,13 @@ bool WindowTaskItem::isWindowItem() const
+ 
+ bool WindowTaskItem::isActive() const
+ {
+-    if (!m_task) {
+-        //kDebug() << "no task set";
+-        return false;
+-    }
+-
+-    return m_task->isActive();
++    return m_task ? m_task.data()->isActive() : false;
+ }
+ 
+ void WindowTaskItem::setAdditionalMimeData(QMimeData* mimeData)
+ {
+     if (m_task) {
+-        m_task->addMimeData(mimeData);
++        m_task.data()->addMimeData(mimeData);
+     }
+ }
+ 
+diff --git a/plasma/desktop/applets/tasks/windowtaskitem.h b/plasma/desktop/applets/tasks/windowtaskitem.h
+index a5b698a..4db9d43 100644
+--- a/plasma/desktop/applets/tasks/windowtaskitem.h
++++ b/plasma/desktop/applets/tasks/windowtaskitem.h
+@@ -63,7 +63,6 @@ signals:
+ 
+ public slots:
+     void activate();
+-    void close();
+ 
+ protected:
+     void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);
+@@ -82,7 +81,7 @@ private:
+     /** Sets the window represented by this task. */
+     void setWindowTask(TaskManager::TaskItem* taskItem);
+ 
+-    TaskManager::TaskItem *m_task;
++    QWeakPointer<TaskManager::TaskItem> m_task;
+     Plasma::BusyWidget *m_busyWidget;
+ };
+ 
diff --git a/kde-workspace-4.7.3-kdebug277036.patch b/kde-workspace-4.7.3-kdebug277036.patch
new file mode 100644
index 0000000..7fc9b50
--- /dev/null
+++ b/kde-workspace-4.7.3-kdebug277036.patch
@@ -0,0 +1,17 @@
+diff -up kde-workspace-4.7.3/plasma/generic/dataengines/geolocation/location_gps.cpp.kdebug277036 kde-workspace-4.7.3/plasma/generic/dataengines/geolocation/location_gps.cpp
+--- kde-workspace-4.7.3/plasma/generic/dataengines/geolocation/location_gps.cpp.kdebug277036	2011-05-20 15:32:08.000000000 -0500
++++ kde-workspace-4.7.3/plasma/generic/dataengines/geolocation/location_gps.cpp	2011-11-17 10:13:01.629167500 -0600
+@@ -83,11 +83,11 @@ Gps::Gps(QObject* parent, const QVariant
+ {
+ #if GPSD_API_MAJOR_VERSION >= 5
+     m_gpsdata = new gps_data_t;
+-    gps_open("localhost", DEFAULT_GPSD_PORT, m_gpsdata);
++    if (gps_open("localhost", DEFAULT_GPSD_PORT, m_gpsdata) != -1) {
+ #else
+     gps_data_t* m_gpsdata = gps_open("localhost", DEFAULT_GPSD_PORT);
+-#endif
+     if (m_gpsdata) {
++#endif
+         kDebug() << "gpsd found.";
+         m_gpsd = new Gpsd(m_gpsdata);
+         connect(m_gpsd, SIGNAL(dataReady(const Plasma::DataEngine::Data&)),
diff --git a/kdebase-workspace.spec b/kdebase-workspace.spec
index e1a4255..9cf61a3 100644
--- a/kdebase-workspace.spec
+++ b/kdebase-workspace.spec
@@ -9,7 +9,7 @@
 Summary: KDE Workspace
 Name:    kdebase-workspace
 Version: 4.7.3
-Release: 11%{?dist}
+Release: 12%{?dist}
 
 License: GPLv2
 Group:   User Interface/Desktops
@@ -81,6 +81,10 @@ Patch52: kdebase-workspace-4.7.0-bz#732830-login.patch
 ## upstream patches
 # battery plasmoid fixes (#753429)
 Patch100: kdebase-workspace-4.7.4-batteryplasmoid.patch
+# Crash in TaskManager::TaskItem::task (kde#272495)
+Patch101: kde-workspace-4.7.3-kdebug272495.patch
+# Crashes When Adding Weather Widgets (Geolocation) [gps_read, Gpsd::run] (kde#277036)
+Patch102: kde-workspace-4.7.3-kdebug277036.patch
 
 ## Fedora specific patches
 ## HAL-ectomy
@@ -377,6 +381,8 @@ Requires: akonadi
 
 # upstream patches
 %patch100 -p1 -b .battery
+%patch101 -p1 -b .kdebug272495
+%patch102 -p1 -b .kdebug277036
 
 # Fedora patches
 %patch200 -p0 -b .no_HAL
@@ -847,6 +853,10 @@ fi
 
 
 %changelog
+* Thu Nov 17 2011 Rex Dieter <rdieter at fedoraproject.org> 4.7.3-12
+- Crash in TaskManager::TaskItem::task (kde#272495)
+- Crashes When Adding Weather Widgets (Geolocation) (kde#277036)
+
 * Thu Nov 17 2011 Lukas Tinkl <ltinkl at redhat.com> 4.7.3-11
 - battery plasmoid fixes (#753429)
 


More information about the scm-commits mailing list