From: Frank Reininghaus Date: Fri, 24 Aug 2012 21:21:31 +0000 (+0200) Subject: Do not crash when finishing inline renaming in unusual ways X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/ca6459ea5a950ed160486cf978be3f5f5a106fd6?hp=89a678241d7f0b341bebd19c006541bd7f28f2ab Do not crash when finishing inline renaming in unusual ways The crash was caused by a null pointer dereference when, e.g., minimizing Dolphin. The root cause was that KStandardItemListWidget::closeRoleEditor() was called twice: once when the role editor loses focus, and once again when the window is resized. After m_roleEditor was set to 0, the second call dereferenced this null pointer. I think the best solution is to disconnect from the role editor's signals when the editor is not needed any more by the KStandardItemListWidget. CCBUG: 304524 (cherry picked from commit a9c2bdc3b53955693e716bbab58c318fe25bdc9b) --- diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 3a76f14a2..7ae7e2efc 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -594,6 +594,11 @@ void KStandardItemListWidget::editedRoleChanged(const QByteArray& current, const if (current.isEmpty() || !parent || current != "text") { if (m_roleEditor) { emit roleEditingCanceled(index(), current, data().value(current)); + + disconnect(m_roleEditor, SIGNAL(roleEditingCanceled(int,QByteArray,QVariant)), + this, SLOT(slotRoleEditingCanceled(int,QByteArray,QVariant))); + disconnect(m_roleEditor, SIGNAL(roleEditingFinished(int,QByteArray,QVariant)), + this, SLOT(slotRoleEditingFinished(int,QByteArray,QVariant))); m_roleEditor->deleteLater(); m_roleEditor = 0; } @@ -1253,6 +1258,11 @@ void KStandardItemListWidget::closeRoleEditor() // to transfer the keyboard focus back to the KItemListContainer. scene()->views()[0]->parentWidget()->setFocus(); } + + disconnect(m_roleEditor, SIGNAL(roleEditingCanceled(int,QByteArray,QVariant)), + this, SLOT(slotRoleEditingCanceled(int,QByteArray,QVariant))); + disconnect(m_roleEditor, SIGNAL(roleEditingFinished(int,QByteArray,QVariant)), + this, SLOT(slotRoleEditingFinished(int,QByteArray,QVariant))); m_roleEditor->deleteLater(); m_roleEditor = 0; }