diff options
author | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@theqtcompany.com> | 2014-10-09 12:46:04 +0200 |
---|---|---|
committer | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@theqtcompany.com> | 2014-10-10 13:37:59 +0200 |
commit | 74a20b77a67ec4d5a8be0f59302075d34151dc05 (patch) | |
tree | d9ac556372caf03b6b56801f15402424d9c5d597 | |
parent | 9685c72e37d618cf44aa15c892375b3c8d27e578 (diff) |
Fix memory leak in QClipboard::setMimeData()
The setMimeData() function is documented to take ownership of
the object passed in, but in the case where the platform
plugin did not support the requested mode, we would simply
return without deleting the object nor telling the application,
so it would cause a potential memory leak. We need to honor the
contract, even when we fail to set the mime data.
Test was updated to avoid verifying the leak in cases where
the platform does not support all modes.
[ChangeLog][QtGui][Clipboard] Fixed a memory leak in setMimeData()
when the platform plugin did not support the requested mode.
Task-number: QTBUG-41852
Change-Id: I2112da1613199fe1b56724e7ccf097b9e912c117
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
-rw-r--r-- | src/gui/kernel/qclipboard.cpp | 11 | ||||
-rw-r--r-- | tests/auto/gui/kernel/qclipboard/tst_qclipboard.cpp | 18 |
2 files changed, 20 insertions, 9 deletions
diff --git a/src/gui/kernel/qclipboard.cpp b/src/gui/kernel/qclipboard.cpp index ec9a8fdcf0..5be9f19b3e 100644 --- a/src/gui/kernel/qclipboard.cpp +++ b/src/gui/kernel/qclipboard.cpp @@ -463,9 +463,14 @@ const QMimeData* QClipboard::mimeData(Mode mode) const void QClipboard::setMimeData(QMimeData* src, Mode mode) { QPlatformClipboard *clipboard = QGuiApplicationPrivate::platformIntegration()->clipboard(); - if (!clipboard->supportsMode(mode)) return; - - clipboard->setMimeData(src,mode); + if (!clipboard->supportsMode(mode)) { + if (src != 0) { + qWarning("Data set on unsupported clipboard mode. QMimeData object will be deleted."); + src->deleteLater(); + } + } else { + clipboard->setMimeData(src,mode); + } } /*! diff --git a/tests/auto/gui/kernel/qclipboard/tst_qclipboard.cpp b/tests/auto/gui/kernel/qclipboard/tst_qclipboard.cpp index 167e4b41bc..a88f41f7b8 100644 --- a/tests/auto/gui/kernel/qclipboard/tst_qclipboard.cpp +++ b/tests/auto/gui/kernel/qclipboard/tst_qclipboard.cpp @@ -340,8 +340,10 @@ void tst_QClipboard::setMimeData() data->setText("foo"); QGuiApplication::clipboard()->setMimeData(data, QClipboard::Clipboard); - QGuiApplication::clipboard()->setMimeData(data, QClipboard::Selection); - QGuiApplication::clipboard()->setMimeData(data, QClipboard::FindBuffer); + if (QGuiApplication::clipboard()->supportsSelection()) + QGuiApplication::clipboard()->setMimeData(data, QClipboard::Selection); + if (QGuiApplication::clipboard()->supportsFindBuffer()) + QGuiApplication::clipboard()->setMimeData(data, QClipboard::FindBuffer); QSignalSpy spySelection(QGuiApplication::clipboard(), SIGNAL(selectionChanged())); QSignalSpy spyData(QGuiApplication::clipboard(), SIGNAL(dataChanged())); @@ -373,8 +375,10 @@ void tst_QClipboard::setMimeData() data->setText("foo"); QGuiApplication::clipboard()->setMimeData(data, QClipboard::Clipboard); - QGuiApplication::clipboard()->setMimeData(data, QClipboard::Selection); - QGuiApplication::clipboard()->setMimeData(data, QClipboard::FindBuffer); + if (QGuiApplication::clipboard()->supportsSelection()) + QGuiApplication::clipboard()->setMimeData(data, QClipboard::Selection); + if (QGuiApplication::clipboard()->supportsFindBuffer()) + QGuiApplication::clipboard()->setMimeData(data, QClipboard::FindBuffer); QMimeData *newData = new QMimeData; newData->setText("bar"); @@ -385,8 +389,10 @@ void tst_QClipboard::setMimeData() spyFindBuffer.clear(); QGuiApplication::clipboard()->setMimeData(newData, QClipboard::Clipboard); - QGuiApplication::clipboard()->setMimeData(newData, QClipboard::Selection); // used to crash on X11 - QGuiApplication::clipboard()->setMimeData(newData, QClipboard::FindBuffer); + if (QGuiApplication::clipboard()->supportsSelection()) + QGuiApplication::clipboard()->setMimeData(newData, QClipboard::Selection); // used to crash on X11 + if (QGuiApplication::clipboard()->supportsFindBuffer()) + QGuiApplication::clipboard()->setMimeData(newData, QClipboard::FindBuffer); if (QGuiApplication::clipboard()->supportsSelection()) QCOMPARE(spySelection.count(), 1); |