Fix crash when triggereing the "Compare files" action via D-Bus

If the number of selected items is not two, Dolphin disables this
action. However, it is still possible to trigger it via D-Bus, and this
could cause a crash in DolphinMainWindow::compareFiles() because this
function did not test at all if there are really two items selected.

This patch adds such a check and simplifies the code in that function.

BUG: 325517
FIXED-IN: 4.11.3
This commit is contained in:
Frank Reininghaus 2013-10-13 10:55:21 +02:00
parent 0c55297ce4
commit 96ba990d86

View file

@ -999,50 +999,23 @@ void DolphinMainWindow::goHome(Qt::MouseButtons buttons)
void DolphinMainWindow::compareFiles() void DolphinMainWindow::compareFiles()
{ {
// The method is only invoked if exactly 2 files have const DolphinViewContainer* primaryViewContainer = m_viewTab[m_tabIndex].primaryView;
// been selected. The selected files may be: Q_ASSERT(primaryViewContainer);
// - both in the primary view KFileItemList items = primaryViewContainer->view()->selectedItems();
// - both in the secondary view
// - one in the primary view and the other in the secondary
// view
Q_ASSERT(m_viewTab[m_tabIndex].primaryView);
KUrl urlA; const DolphinViewContainer* secondaryViewContainer = m_viewTab[m_tabIndex].secondaryView;
KUrl urlB; if (secondaryViewContainer) {
items.append(secondaryViewContainer->view()->selectedItems());
KFileItemList items = m_viewTab[m_tabIndex].primaryView->view()->selectedItems();
switch (items.count()) {
case 0: {
Q_ASSERT(m_viewTab[m_tabIndex].secondaryView);
items = m_viewTab[m_tabIndex].secondaryView->view()->selectedItems();
Q_ASSERT(items.count() == 2);
urlA = items[0].url();
urlB = items[1].url();
break;
} }
case 1: { if (items.count() != 2) {
urlA = items[0].url(); // The action is disabled in this case, but it could have been triggered
Q_ASSERT(m_viewTab[m_tabIndex].secondaryView); // via D-Bus, see https://bugs.kde.org/show_bug.cgi?id=325517
items = m_viewTab[m_tabIndex].secondaryView->view()->selectedItems(); return;
Q_ASSERT(items.count() == 1);
urlB = items[0].url();
break;
} }
case 2: { KUrl urlA = items.at(0).url();
urlA = items[0].url(); KUrl urlB = items.at(1).url();
urlB = items[1].url();
break;
}
default: {
// may not happen: compareFiles may only get invoked if 2
// files are selected
Q_ASSERT(false);
}
}
QString command("kompare -c \""); QString command("kompare -c \"");
command.append(urlA.pathOrUrl()); command.append(urlA.pathOrUrl());