From: Carlos Garnacho Date: Wed, 24 Jun 2015 17:57:40 +0000 (+0200) Subject: wayland: Ensure we cancel previous selection writes before starting one X-Git-Tag: archive/raspbian/4.4.1+ds1-2+rpi1^2~18^2~24^2~9282 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=5e7159413d2545e3fd1454b14852f8c4f82ec0c5;p=gtk4.git wayland: Ensure we cancel previous selection writes before starting one We weren't catching all the places where the AsyncWriteData operation should be cancelled, which could happen if we repeatedly request the same target on different fds. https://bugzilla.gnome.org/show_bug.cgi?id=751414 --- diff --git a/gdk/wayland/gdkselection-wayland.c b/gdk/wayland/gdkselection-wayland.c index d109562fa6..86bfde21a2 100644 --- a/gdk/wayland/gdkselection-wayland.c +++ b/gdk/wayland/gdkselection-wayland.c @@ -466,6 +466,15 @@ gdk_wayland_selection_check_write (GdkWaylandSelection *selection) selection->stored_selection.data_len == 0) return FALSE; + /* Cancel any previous ongoing async write */ + if (selection->stored_selection.cancellable) + { + g_cancellable_cancel (selection->stored_selection.cancellable); + g_object_unref (selection->stored_selection.cancellable); + } + + selection->stored_selection.cancellable = g_cancellable_new (); + write_data = async_write_data_new (selection); async_write_data_write (write_data); selection->stored_selection.fd = -1; @@ -512,17 +521,10 @@ gdk_wayland_selection_store (GdkWindow *window, g_free (selection->stored_selection.data); } - if (selection->stored_selection.cancellable) - { - g_cancellable_cancel (selection->stored_selection.cancellable); - g_object_unref (selection->stored_selection.cancellable); - } - selection->stored_selection.source = window; selection->stored_selection.data_len = array->len; selection->stored_selection.data = (guchar *) g_array_free (array, FALSE); selection->stored_selection.type = type; - selection->stored_selection.cancellable = g_cancellable_new (); gdk_wayland_selection_check_write (selection); }