96e0061
changeset:   567293:4d5e5e9f146e
96e0061
tag:         tip
96e0061
parent:      567291:3bdf0c33844f
96e0061
user:        stransky <stransky@redhat.com>
96e0061
date:        Fri Jan 29 12:13:15 2021 +0100
96e0061
files:       widget/gtk/nsClipboardWayland.cpp
96e0061
description:
96e0061
Bug 1631061 [Wayland] Clear clipboard content when gtk_clipboard_request_contents() fails, r?jhorak
96e0061
96e0061
Differential Revision: https://phabricator.services.mozilla.com/D103461
96e0061
96e0061
96e0061
diff --git a/widget/gtk/nsClipboardWayland.cpp b/widget/gtk/nsClipboardWayland.cpp
96e0061
--- a/widget/gtk/nsClipboardWayland.cpp
96e0061
+++ b/widget/gtk/nsClipboardWayland.cpp
96e0061
@@ -842,7 +842,8 @@ struct FastTrackClipboard {
96e0061
 
96e0061
 static void wayland_clipboard_contents_received(
96e0061
     GtkClipboard* clipboard, GtkSelectionData* selection_data, gpointer data) {
96e0061
-  LOGCLIP(("wayland_clipboard_contents_received() callback\n"));
96e0061
+  LOGCLIP(("wayland_clipboard_contents_received() selection_data = %p\n",
96e0061
+           selection_data));
96e0061
   FastTrackClipboard* fastTrack = static_cast<FastTrackClipboard*>(data);
96e0061
   fastTrack->mRetrievalContex->TransferFastTrackClipboard(
96e0061
       fastTrack->mClipboardRequestNumber, selection_data);
96e0061
@@ -851,24 +852,34 @@ static void wayland_clipboard_contents_r
96e0061
 
96e0061
 void nsRetrievalContextWayland::TransferFastTrackClipboard(
96e0061
     int aClipboardRequestNumber, GtkSelectionData* aSelectionData) {
96e0061
-  LOGCLIP(("nsRetrievalContextWayland::TransferFastTrackClipboard()\n"));
96e0061
+  LOGCLIP(
96e0061
+      ("nsRetrievalContextWayland::TransferFastTrackClipboard(), "
96e0061
+       "aSelectionData = %p\n",
96e0061
+       aSelectionData));
96e0061
+
96e0061
+  int dataLength = gtk_selection_data_get_length(aSelectionData);
96e0061
+  if (dataLength < 0) {
96e0061
+    LOGCLIP(
96e0061
+        ("    gtk_clipboard_request_contents() failed to get clipboard "
96e0061
+         "data!\n"));
96e0061
+    ReleaseClipboardData(mClipboardData);
96e0061
+    return;
96e0061
+  }
96e0061
 
96e0061
   if (mClipboardRequestNumber == aClipboardRequestNumber) {
96e0061
     LOGCLIP(("    request number matches\n"));
96e0061
-    int dataLength = gtk_selection_data_get_length(aSelectionData);
96e0061
-    if (!dataLength) {
96e0061
-      LOGCLIP(
96e0061
-          ("    gtk_selection_data_get_length() returned 0 data length!\n"));
96e0061
-      return;
96e0061
-    }
96e0061
     LOGCLIP(("    fastracking %d bytes of data.\n", dataLength));
96e0061
     mClipboardDataLength = dataLength;
96e0061
-    mClipboardData = reinterpret_cast<char*>(
96e0061
-        g_malloc(sizeof(char) * (mClipboardDataLength + 1)));
96e0061
-    memcpy(mClipboardData, gtk_selection_data_get_data(aSelectionData),
96e0061
-           sizeof(char) * mClipboardDataLength);
96e0061
-    mClipboardData[mClipboardDataLength] = '\0';
96e0061
-    LOGCLIP(("    done, mClipboardData = %p\n", mClipboardData));
96e0061
+    if (dataLength > 0) {
96e0061
+      mClipboardData = reinterpret_cast<char*>(
96e0061
+          g_malloc(sizeof(char) * (mClipboardDataLength + 1)));
96e0061
+      memcpy(mClipboardData, gtk_selection_data_get_data(aSelectionData),
96e0061
+             sizeof(char) * mClipboardDataLength);
96e0061
+      mClipboardData[mClipboardDataLength] = '\0';
96e0061
+      LOGCLIP(("    done, mClipboardData = %p\n", mClipboardData));
96e0061
+    } else {
96e0061
+      ReleaseClipboardData(mClipboardData);
96e0061
+    }
96e0061
   } else {
96e0061
     LOGCLIP(("    request number does not match!\n"));
96e0061
     NS_WARNING("Received obsoleted clipboard data!");
96e0061
@@ -952,11 +963,10 @@ void nsRetrievalContextWayland::ReleaseC
96e0061
     const char* aClipboardData) {
96e0061
   LOGCLIP(("nsRetrievalContextWayland::ReleaseClipboardData [%p]\n",
96e0061
            aClipboardData));
96e0061
-
96e0061
-  NS_ASSERTION(aClipboardData == mClipboardData,
96e0061
-               "Releasing unknown clipboard data!");
96e0061
-  g_free((void*)aClipboardData);
96e0061
-
96e0061
+  if (aClipboardData != mClipboardData) {
96e0061
+    NS_WARNING("Wayland clipboard: Releasing unknown clipboard data!");
96e0061
+  }
96e0061
+  g_free((void*)mClipboardData);
96e0061
+  mClipboardDataLength = 0;
96e0061
   mClipboardData = nullptr;
96e0061
-  mClipboardDataLength = 0;
96e0061
 }
96e0061