diff options
author | Timur Pocheptsov <timur.pocheptsov@qt.io> | 2022-09-13 09:01:13 +0200 |
---|---|---|
committer | Timur Pocheptsov <timur.pocheptsov@qt.io> | 2022-09-14 08:44:22 +0200 |
commit | 20d7d41a7486fd5cbc659c5d19b65d0f2d21f596 (patch) | |
tree | 7106037748fb1b9e7acf0c72a6386d2259f5b114 /src/plugins/platforms/cocoa/qmacclipboard.mm | |
parent | 88fbbb422e277a5dd56ae9d0f2d961362be2145e (diff) |
QMacPasteboard: check QGuiApplication is alive for a promise containing QPixmap
Otherwise, when platform integration is deleted, it triggers resolving
promises after the global instance of QGuiApplication is dead and
QPixmap in turn calls qFatal, crashing the exiting app.
Fixes: QTBUG-106472
Change-Id: Ie706d030214c33abdbc8fff86cc2eddd0c632f1b
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Diffstat (limited to 'src/plugins/platforms/cocoa/qmacclipboard.mm')
-rw-r--r-- | src/plugins/platforms/cocoa/qmacclipboard.mm | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/plugins/platforms/cocoa/qmacclipboard.mm b/src/plugins/platforms/cocoa/qmacclipboard.mm index 5b77413def..b298a47bef 100644 --- a/src/plugins/platforms/cocoa/qmacclipboard.mm +++ b/src/plugins/platforms/cocoa/qmacclipboard.mm @@ -8,6 +8,7 @@ #include <QtGui/qguiapplication.h> #include <QtGui/qbitmap.h> #include <QtCore/qdatetime.h> +#include <QtCore/qmetatype.h> #include <QtCore/qdebug.h> #include <QtCore/private/qcore_mac_p.h> #include <QtGui/qguiapplication.h> @@ -57,9 +58,12 @@ QMacPasteboard::Promise::Promise(int itemId, QMacInternalPasteboardMime *c, QStr // Request the data from the application immediately for eager requests. if (dataRequestType == QMacPasteboard::EagerRequest) { variantData = md->variantData(m); + isPixmap = variantData.metaType().id() == QMetaType::QPixmap; mimeData = nullptr; } else { mimeData = md; + if (md->hasImage()) + isPixmap = md->imageData().metaType().id() == QMetaType::QPixmap; } } @@ -170,8 +174,14 @@ OSStatus QMacPasteboard::promiseKeeper(PasteboardRef paste, PasteboardItemID id, // to request the data from the application. QVariant promiseData; if (promise.dataRequestType == LazyRequest) { - if (!qpaste->resolvingBeforeDestruction && !promise.mimeData.isNull()) + if (!qpaste->resolvingBeforeDestruction && !promise.mimeData.isNull()) { + if (promise.isPixmap && !QGuiApplication::instance()) { + qCWarning(lcQpaClipboard, + "Cannot keep promise, data contains QPixmap and requires livining QGuiApplication"); + return cantGetFlavorErr; + } promiseData = promise.mimeData->variantData(promise.mime); + } } else { promiseData = promise.variantData; } |