wayland: Ensure we cancel previous selection writes before starting one
authorCarlos Garnacho <carlosg@gnome.org>
Wed, 24 Jun 2015 17:57:40 +0000 (19:57 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Wed, 24 Jun 2015 21:52:50 +0000 (23:52 +0200)
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

gdk/wayland/gdkselection-wayland.c

index d109562fa644ccd8f2fb9f561c7d2bb7e670b7df..86bfde21a23ef8b322a56bc865ed22177ab27501 100644 (file)
@@ -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);
 }