[Spice-devel] [PATCH spice-gtk] spice-widget: Fix use after free

Victor Toso victortoso at redhat.com
Thu Apr 19 10:58:00 UTC 2018


Hi,

On Thu, Apr 19, 2018 at 11:25:12AM +0100, Frediano Ziglio wrote:
> Before d567bfe65f010556f12c7ca5e95d0e480b2e4a70
> ("spice-widget: fix leak of boxed type cursor-shape") the cursor was
> just leaked. Now is freed however mouse_pixbuf points to cursor
> data so when the cursor is freed mouse_pixbuf points to a dangling
> pointer. Retain the cursor as long as mouse_pixbuf is live.

Sure

> 
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
>  src/spice-widget-priv.h |  1 +
>  src/spice-widget.c      | 10 +++++++++-
>  2 files changed, 10 insertions(+), 1 deletion(-)
> 
> diff --git a/src/spice-widget-priv.h b/src/spice-widget-priv.h
> index 1189cbb..68ab77b 100644
> --- a/src/spice-widget-priv.h
> +++ b/src/spice-widget-priv.h
> @@ -101,6 +101,7 @@ struct _SpiceDisplayPrivate {
>      bool                    mouse_have_pointer;
>      GdkCursor               *mouse_cursor;
>      GdkPixbuf               *mouse_pixbuf;
> +    SpiceCursorShape *cursor_shape;

I'd say that alignment here to keep local coding style or a extra
patch to apply coding style ..

>      GdkPoint                mouse_hotspot;
>      GdkCursor               *show_cursor;
>      int                     mouse_last_x;
> diff --git a/src/spice-widget.c b/src/spice-widget.c
> index 8a6b5ab..ef06dfc 100644
> --- a/src/spice-widget.c
> +++ b/src/spice-widget.c
> @@ -457,6 +457,10 @@ static void spice_display_finalize(GObject *obj)
>      g_clear_object(&d->show_cursor);
>      g_clear_object(&d->mouse_cursor);
>      g_clear_object(&d->mouse_pixbuf);
> +    if (d->cursor_shape != NULL) {
> +        g_boxed_free(SPICE_TYPE_CURSOR_SHAPE, d->cursor_shape);
> +        d->cursor_shape = NULL;
> +    }
>  
>      G_OBJECT_CLASS(spice_display_parent_class)->finalize(obj);
>  }
> @@ -2661,6 +2665,11 @@ static void cursor_set(SpiceCursorChannel *channel,
>  
>      cursor_invalidate(display);
>      g_clear_object(&d->mouse_pixbuf);
> +    if (d->cursor_shape != NULL) {
> +        g_boxed_free(SPICE_TYPE_CURSOR_SHAPE, d->cursor_shape);
> +        d->cursor_shape = NULL;
> +    }
> +    d->cursor_shape = cursor_shape;
>      d->mouse_pixbuf = gdk_pixbuf_new_from_data(cursor_shape->data,
>                                                 GDK_COLORSPACE_RGB,
>                                                 TRUE, 8,
> @@ -2670,7 +2679,6 @@ static void cursor_set(SpiceCursorChannel *channel,
>                                                 NULL, NULL);
>      d->mouse_hotspot.x = cursor_shape->hot_spot_x;
>      d->mouse_hotspot.y = cursor_shape->hot_spot_y;
> -    g_boxed_free(SPICE_TYPE_CURSOR_SHAPE, cursor_shape);

        toso

>      cursor = gdk_cursor_new_from_pixbuf(gtk_widget_get_display(GTK_WIDGET(display)),
>                                          d->mouse_pixbuf,
>                                          d->mouse_hotspot.x,
> -- 
> 2.14.3
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20180419/7ce2b4ba/attachment.sig>


More information about the Spice-devel mailing list