Bug 1438132 - Don't return false-positive data from clipboard, r?jhorak
MozReview-Commit-ID: 5I9DbpYJ8EL
--- 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)
{