firefox/mozilla-1631061-2.patch

92 lines
3.6 KiB
Diff

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