From 9dc1513f8bae968a363ea74af90a4042382d3d20 Mon Sep 17 00:00:00 2001 From: Frank Reininghaus Date: Thu, 12 Jun 2014 08:37:11 +0200 Subject: [PATCH] Do not crash if QApplication::clipboard()->mimeData() is a null pointer This removes the remaining unchecked accesses to the clipboard mime data after commit 7828b057da0491f1b08bfaec681067e195d7b6ca. According to a bug report, it can be a null pointer on Wayland. BUG: 335053 REVIEW: 118649 --- src/dolphincontextmenu.cpp | 5 ++--- src/kitemviews/private/kfileitemclipboard.cpp | 8 ++++++++ src/panels/folders/treeviewcontextmenu.cpp | 19 ++++--------------- 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/dolphincontextmenu.cpp b/src/dolphincontextmenu.cpp index f295de708..e692c8fa9 100644 --- a/src/dolphincontextmenu.cpp +++ b/src/dolphincontextmenu.cpp @@ -429,10 +429,9 @@ QAction* DolphinContextMenu::createPasteAction() QAction* action = 0; const bool isDir = !m_fileInfo.isNull() && m_fileInfo.isDir(); if (isDir && (m_selectedItems.count() == 1)) { + const QPair pasteInfo = KonqOperations::pasteInfo(m_fileInfo.url()); action = new QAction(KIcon("edit-paste"), i18nc("@action:inmenu", "Paste Into Folder"), this); - const QMimeData* mimeData = QApplication::clipboard()->mimeData(); - const KUrl::List pasteData = KUrl::List::fromMimeData(mimeData); - action->setEnabled(!pasteData.isEmpty() && selectedItemsProperties().supportsWriting()); + action->setEnabled(pasteInfo.first); connect(action, SIGNAL(triggered()), m_mainWindow, SLOT(pasteIntoFolder())); } else { action = m_mainWindow->actionCollection()->action(KStandardAction::name(KStandardAction::Paste)); diff --git a/src/kitemviews/private/kfileitemclipboard.cpp b/src/kitemviews/private/kfileitemclipboard.cpp index faace2a3a..0dcc81f4f 100644 --- a/src/kitemviews/private/kfileitemclipboard.cpp +++ b/src/kitemviews/private/kfileitemclipboard.cpp @@ -55,6 +55,14 @@ KFileItemClipboard::~KFileItemClipboard() void KFileItemClipboard::updateCutItems() { const QMimeData* mimeData = QApplication::clipboard()->mimeData(); + + // mimeData can be 0 according to https://bugs.kde.org/show_bug.cgi?id=335053 + if (!mimeData) { + m_cutItems.clear(); + emit cutItemsChanged(); + return; + } + const QByteArray data = mimeData->data("application/x-kde-cutselection"); const bool isCutSelection = (!data.isEmpty() && data.at(0) == QLatin1Char('1')); if (isCutSelection) { diff --git a/src/panels/folders/treeviewcontextmenu.cpp b/src/panels/folders/treeviewcontextmenu.cpp index fa8844dfa..83ffa87a7 100644 --- a/src/panels/folders/treeviewcontextmenu.cpp +++ b/src/panels/folders/treeviewcontextmenu.cpp @@ -62,11 +62,10 @@ void TreeViewContextMenu::open() QAction* copyAction = new QAction(KIcon("edit-copy"), i18nc("@action:inmenu", "Copy"), this); connect(copyAction, SIGNAL(triggered()), this, SLOT(copy())); - QAction* pasteAction = new QAction(KIcon("edit-paste"), i18nc("@action:inmenu", "Paste"), this); - const QMimeData* mimeData = QApplication::clipboard()->mimeData(); - const KUrl::List pasteData = KUrl::List::fromMimeData(mimeData); + const QPair pasteInfo = KonqOperations::pasteInfo(m_fileItem.url()); + QAction* pasteAction = new QAction(KIcon("edit-paste"), pasteInfo.second, this); connect(pasteAction, SIGNAL(triggered()), this, SLOT(paste())); - pasteAction->setEnabled(!pasteData.isEmpty() && capabilities.supportsWriting()); + pasteAction->setEnabled(pasteInfo.first); popup->addAction(cutAction); popup->addAction(copyAction); @@ -172,17 +171,7 @@ void TreeViewContextMenu::copy() void TreeViewContextMenu::paste() { - QClipboard* clipboard = QApplication::clipboard(); - const QMimeData* mimeData = clipboard->mimeData(); - - const KUrl::List source = KUrl::List::fromMimeData(mimeData); - const KUrl& dest = m_fileItem.url(); - if (KonqMimeData::decodeIsCutSelection(mimeData)) { - KonqOperations::copy(m_parent, KonqOperations::MOVE, source, dest); - clipboard->clear(); - } else { - KonqOperations::copy(m_parent, KonqOperations::COPY, source, dest); - } + KonqOperations::doPaste(m_parent, m_fileItem.url()); } void TreeViewContextMenu::rename()