[mutter/gnome-3-34] x11: Don't exceed transfer size in INCR chunks



commit cedab9442f8af192e0cb2052d22f31b20b97ff5f
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sat Apr 11 17:21:20 2020 +0200

    x11: Don't exceed transfer size in INCR chunks
    
    The stream automatically flushes after data size exceeds the
    size we deem for INCR chunks, but we still try to copy it all.
    Actually limit the data we copy, and leave the rest for future
    INCR chunks.
    
    https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1198
    
    (cherry picked from commit 7015bb3efd5e588e50be9948f32ee04fa4bd8319)

 src/x11/meta-x11-selection-output-stream.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)
---
diff --git a/src/x11/meta-x11-selection-output-stream.c b/src/x11/meta-x11-selection-output-stream.c
index 9c16ac746..fa6b27523 100644
--- a/src/x11/meta-x11-selection-output-stream.c
+++ b/src/x11/meta-x11-selection-output-stream.c
@@ -207,7 +207,7 @@ meta_x11_selection_output_stream_perform_flush (MetaX11SelectionOutputStream *st
   MetaX11SelectionOutputStreamPrivate *priv =
     meta_x11_selection_output_stream_get_instance_private (stream);
   Display *xdisplay;
-  size_t element_size, n_elements;
+  size_t element_size, n_elements, max_size;
   gboolean first_chunk = FALSE;
   int error_code;
 
@@ -222,6 +222,7 @@ meta_x11_selection_output_stream_perform_flush (MetaX11SelectionOutputStream *st
 
   element_size = get_element_size (priv->format);
   n_elements = priv->data->len / element_size;
+  max_size = get_max_request_size (priv->x11_display);
 
   if (!priv->incr)
     first_chunk = TRUE;
@@ -251,9 +252,13 @@ meta_x11_selection_output_stream_perform_flush (MetaX11SelectionOutputStream *st
     }
   else
     {
+      size_t copy_n_elements;
+
       if (priv->incr && priv->data->len > 0)
         priv->delete_pending = TRUE;
 
+      copy_n_elements = MIN (n_elements, max_size / element_size);
+
       XChangeProperty (xdisplay,
                        priv->xwindow,
                        priv->xproperty,
@@ -261,8 +266,8 @@ meta_x11_selection_output_stream_perform_flush (MetaX11SelectionOutputStream *st
                        priv->format,
                        PropModeReplace,
                        priv->data->data,
-                       n_elements);
-      g_byte_array_remove_range (priv->data, 0, n_elements * element_size);
+                       copy_n_elements);
+      g_byte_array_remove_range (priv->data, 0, copy_n_elements * element_size);
     }
 
   if (first_chunk)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]