[Spice-devel] [spice-gtk 2/2] Recheck clipboard size after modifying its data

Christophe Fergeau cfergeau at redhat.com
Mon Nov 17 06:17:32 PST 2014


SpiceGtkSession::clipboard_received_cb() starts by checking if the
clipboard is empty, or if the length of its data exceeds
'max-clipboard-size'.

Later in that function, the data is modified, and can be shortened
(removal of trailing '\0' or of '\r' for Windows -> linux copy and
paste), or enlarged (addition of '\r' for linux -> Windows c&p).

This commit adds another check that the clipboard length is still valid
(non-0, and not bigger than 'max-clipboard-size') after making these
transformations.
---
 gtk/spice-gtk-session.c | 29 ++++++++++++++++++++++-------
 1 file changed, 22 insertions(+), 7 deletions(-)

diff --git a/gtk/spice-gtk-session.c b/gtk/spice-gtk-session.c
index 26a0ecf..ca32d28 100644
--- a/gtk/spice-gtk-session.c
+++ b/gtk/spice-gtk-session.c
@@ -826,6 +826,24 @@ skip_grab_clipboard:
     return TRUE;
 }
 
+static gboolean check_clipboard_size_limits(SpiceGtkSession *session,
+                                            gint clipboard_len)
+{
+    int max_clipboard;
+
+    g_object_get(session->priv->main, "max-clipboard", &max_clipboard, NULL);
+    if (max_clipboard != -1 && clipboard_len > max_clipboard) {
+        g_warning("discarded clipboard of size %d (max: %d)",
+                  clipboard_len, max_clipboard);
+        return FALSE;
+    } else if (clipboard_len <= 0) {
+        SPICE_DEBUG("discarding empty clipboard");
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
 static void clipboard_received_cb(GtkClipboard *clipboard,
                                   GtkSelectionData *selection_data,
                                   gpointer user_data)
@@ -845,18 +863,12 @@ static void clipboard_received_cb(GtkClipboard *clipboard,
     gchar* name;
     GdkAtom atom;
     int selection;
-    int max_clipboard;
 
     selection = get_selection_from_clipboard(s, clipboard);
     g_return_if_fail(selection != -1);
 
-    g_object_get(s->main, "max-clipboard", &max_clipboard, NULL);
     len = gtk_selection_data_get_length(selection_data);
-    if (max_clipboard != -1 && len > max_clipboard) {
-        g_warning("discarded clipboard of size %d (max: %d)", len, max_clipboard);
-        return;
-    } else if (len <= 0) {
-        SPICE_DEBUG("discarding empty clipboard");
+    if (!check_clipboard_size_limits(self, len)) {
         return;
     } else {
         atom = gtk_selection_data_get_data_type(selection_data);
@@ -902,6 +914,9 @@ static void clipboard_received_cb(GtkClipboard *clipboard,
              */
             len = strlen((const char *)data);
         }
+        if (!check_clipboard_size_limits(self, len)) {
+            return;
+        }
     }
 
     spice_main_clipboard_selection_notify(s->main, selection, type,
-- 
2.1.0



More information about the Spice-devel mailing list