Bug 1438132 - Don't return false-positive data from clipboard, r?jhorak draft
authorMartin Stransky <stransky@redhat.com>
Thu, 01 Mar 2018 14:07:15 +0100
changeset 761772 b49fa09d618bc7c021ec8dedd67ba1af01f02a4d
parent 761746 0f8f71b0b9d84e7732c07f841e395de516b31b66
push id100993
push userstransky@redhat.com
push dateThu, 01 Mar 2018 13:07:34 +0000
reviewersjhorak
bugs1438132
milestone60.0a1
Bug 1438132 - Don't return false-positive data from clipboard, r?jhorak MozReview-Commit-ID: 5I9DbpYJ8EL
widget/gtk/nsClipboardWayland.cpp
--- a/widget/gtk/nsClipboardWayland.cpp
+++ b/widget/gtk/nsClipboardWayland.cpp
@@ -385,16 +385,19 @@ nsRetrievalContextWayland::TransferFastT
     }
 }
 
 const char*
 nsRetrievalContextWayland::GetClipboardData(const char* aMimeType,
                                             int32_t aWhichClipboard,
                                             uint32_t* aContentLength)
 {
+    NS_ASSERTION(mClipboardData == nullptr && mClipboardDataLength == 0,
+                 "Looks like we're leaking clipboard data here!");
+
     /* If actual clipboard data is owned by us we don't need to go
      * through Wayland but we ask Gtk+ to directly call data
      * getter callback nsClipboard::SelectionGetEvent().
      * see gtk_selection_convert() at gtk+/gtkselection.c.
      */
     GdkAtom selection = GetSelectionAtom(aWhichClipboard);
     if (gdk_selection_owner_get(selection)) {
         mClipboardRequestNumber++;
@@ -451,16 +454,24 @@ nsRetrievalContextWayland::GetClipboardD
             NS_WARNING(
                 nsPrintfCString("Unexpected error when reading clipboard data: %s",
                                 error->message).get());
             g_error_free(error);
         }
 
         g_io_channel_unref(channel);
         close(pipe_fd[0]);
+
+        // We don't have valid clipboard data although
+        // g_io_channel_read_to_end() allocated mClipboardData for us.
+        // Release it now and return nullptr to indicate
+        // we don't have reqested data flavour.
+        if (mClipboardData && mClipboardDataLength == 0) {
+            ReleaseClipboardData(mClipboardData);
+        }
     }
 
     *aContentLength = mClipboardDataLength;
     return reinterpret_cast<const char*>(mClipboardData);
 }
 
 void nsRetrievalContextWayland::ReleaseClipboardData(const char* aClipboardData)
 {