summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Luby <patrick.luby@collabora.com>2023-03-10 12:11:25 -0500
committerAndras Timar <andras.timar@collabora.com>2023-03-10 20:32:57 +0000
commit1dd68786a927a23e5465589025abd90b8c9f4e7b (patch)
tree53b27a08deacac3cb179558aa4c47424608b045f
parent0e730e0adac55baebf22d87117d6da96c7567806 (diff)
gh#5908 handle pasting disallowed clipboard contents on iOS
When another app owns the current clipboard contents, pasting will display a "allow or disallow" dialog. If the disallow option is selected, the data from the UIPasteboard will be garbage and GetLOKNotifier() will return a nullptr. Since calling SetLOKNotifier() with a nullptr aborts in an assert(), fix the crash by failing gracefully. Also, throw an exception if the -[UIPasteboard dataForPasteboardType:] returns nil. By throwing an exception, the "allow or disallow" dialog will display again the next time the user tries to paste. Change-Id: I05d689b679a7643a8478e3ce0f416205fdf8ec23 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/148655 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com> Reviewed-by: Andras Timar <andras.timar@collabora.com>
-rw-r--r--vcl/ios/iOSTransferable.cxx10
-rw-r--r--vcl/source/window/dialog.cxx13
2 files changed, 23 insertions, 0 deletions
diff --git a/vcl/ios/iOSTransferable.cxx b/vcl/ios/iOSTransferable.cxx
index ece771e7f60b..bfbc8a9afa82 100644
--- a/vcl/ios/iOSTransferable.cxx
+++ b/vcl/ios/iOSTransferable.cxx
@@ -109,6 +109,16 @@ Any SAL_CALL iOSTransferable::getTransferData(const DataFlavor& aFlavor)
DataProviderPtr_t dp;
NSData* sysData = [[UIPasteboard generalPasteboard] dataForPasteboardType:sysFormat];
+ if (!sysData)
+ {
+ // Related: gh#5908 throw an exception if the data flavor is nil
+ // If nil is returned, it can mean that the user has selected the
+ // "disallow" option and so we can't access the current clipboard
+ // contents. Also, by throwing an exception, the "allow or disallow"
+ // dialog will display again the next time the user tries to paste.
+ throw UnsupportedFlavorException("Data flavor is nil", static_cast<XTransferable*>(this));
+ }
+
dp = DataFlavorMapper::getDataProvider(sysFormat, sysData);
if (dp.get() == nullptr)
diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx
index ce10e363e0aa..1047103e3943 100644
--- a/vcl/source/window/dialog.cxx
+++ b/vcl/source/window/dialog.cxx
@@ -925,7 +925,20 @@ bool Dialog::ImplStartExecute()
if (bModal)
{
if (bKitActive && !GetLOKNotifier())
+ {
+#ifdef IOS
+ // gh#5908 handle pasting disallowed clipboard contents on iOS
+ // When another app owns the current clipboard contents, pasting
+ // will display a "allow or disallow" dialog. If the disallow
+ // option is selected, the data from the UIPasteboard will be
+ // garbage and we will find ourselves here. Since calling
+ // SetLOKNotifier() with a nullptr aborts in an assert(), fix
+ // the crash by failing gracefully.
+ return false;
+#else
SetLOKNotifier(mpDialogImpl->m_aInstallLOKNotifierHdl.Call(nullptr));
+#endif
+ }
switch ( Application::GetDialogCancelMode() )
{