[Spice-devel] [spice-gtk 2/2] Recheck clipboard size after modifying its data
Marc-André Lureau
marcandre.lureau at gmail.com
Mon Nov 17 06:54:18 PST 2014
looks good, ack
On Mon, Nov 17, 2014 at 3:17 PM, Christophe Fergeau <cfergeau at redhat.com> wrote:
> 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
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
--
Marc-André Lureau
More information about the Spice-devel
mailing list