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.

BUG: 304524
FIXED-IN: 4.9.1
This commit is contained in:
Frank Reininghaus 2012-08-24 23:21:31 +02:00
parent 168d0511c7
commit a9c2bdc3b5

View file

@ -594,6 +594,11 @@ void KStandardItemListWidget::editedRoleChanged(const QByteArray& current, const
if (current.isEmpty() || !parent || current != "text") { if (current.isEmpty() || !parent || current != "text") {
if (m_roleEditor) { if (m_roleEditor) {
emit roleEditingCanceled(index(), current, data().value(current)); 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->deleteLater();
m_roleEditor = 0; m_roleEditor = 0;
} }
@ -1253,6 +1258,11 @@ void KStandardItemListWidget::closeRoleEditor()
// to transfer the keyboard focus back to the KItemListContainer. // to transfer the keyboard focus back to the KItemListContainer.
scene()->views()[0]->parentWidget()->setFocus(); 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->deleteLater();
m_roleEditor = 0; m_roleEditor = 0;
} }