[virt-tools-list] [virt-viewer] Don't unref 'display' in VirtViewerDisplaySpice::finalize
Fabiano Fidêncio
fidencio at redhat.com
Tue Sep 23 13:21:21 UTC 2014
On Mon, 2014-09-22 at 16:56 +0200, Christophe Fergeau wrote:
> Right after being created, the SpiceDisplay 'display' private member is
> added to the VirtViewerDisplaySpice GTK+ container with
> gtk_container_add. This call will take ownership of the floating
> reference that SpiceDisplay got upon creation.
> This means VirtViewerDisplaySpice::display is a pointer to SpiceDisplay,
> but it must not be unref'ed when the object is destroyed as we don't own
> that reference.
> As the container which owns the reference is the
> VirtViewerDisplaySpice instance itself, we don't need to take an
> additional reference here.
>
> This fixes a crash when exiting remote-viewer after connecting to a
> SPICE VM:
> #0 0x00007ffff3f33a81 in g_type_check_instance_is_fundamentally_a (type_instance=0x874500, fundamental_type=80) at gtype.c:3981
> #1 0x00007ffff3f19f96 in g_object_unref (_object=0x874500) at gobject.c:3067
> #2 0x000000000042a1ea in virt_viewer_display_spice_finalize (obj=0x6ebc30) at virt-viewer-display-spice.c:65
> #3 0x00007ffff3f1a257 in g_object_unref (_object=0x6ebc30) at gobject.c:3170
> #4 0x0000000000428de7 in destroy_display (data=0x6ebc30) at virt-viewer-session-spice.c:649
> #5 0x00007ffff3bbb51b in g_ptr_array_foreach (array=0x7e12a0, func=0x428d71 <destroy_display>, user_data=0x0) at garray.c:1502
> #6 0x00007ffff3bbaadf in ptr_array_free (array=0x7e12a0, flags=FREE_SEGMENT) at garray.c:1088
> #7 0x00007ffff3bbaa10 in g_ptr_array_unref (array=0x7e12a0) at garray.c:1036
> #8 0x00007ffff3bcf9bd in g_data_set_internal (datalist=0xa0adb0, key_id=1622, new_data=0x0, new_destroy_func=0x0, dataset=0x0) at gdataset.c:407
> #9 0x00007ffff3bcfe74 in g_datalist_id_set_data_full (datalist=0xa0adb0, key_id=1622, data=0x0, destroy_func=0x0) at gdataset.c:670
> #10 0x00007ffff3f1a771 in g_object_set_data (object=0xa0ada0, key=0x437252 "virt-viewer-displays", data=0x0) at gobject.c:3461
> #11 0x0000000000429b56 in virt_viewer_session_spice_channel_destroy (s=0x6eb910, channel=0xa0ada0, session=0x8cb3a0) at virt-viewer-session-spice.c:854
> #12 0x00007ffff3f12d81 in g_cclosure_marshal_VOID__OBJECT (closure=0x8e8fd0, return_value=0x0, n_param_values=2, param_values=0x7fffffffcd80, invocation_hint=0x7fffffffccc0, marshal_data=0x0) at gmarshal.c:1272
> #13 0x00007ffff3f0e143 in g_closure_invoke (closure=0x8e8fd0, return_value=0x0, n_param_values=2, param_values=0x7fffffffcd80, invocation_hint=0x7fffffffccc0) at gclosure.c:768
> #14 0x00007ffff3f2aef0 in signal_emit_unlocked_R (node=0x7c1f20, detail=0, instance=0x6eb910, emission_return=0x0, instance_and_params=0x7fffffffcd80) at gsignal.c:3553
> #15 0x00007ffff3f2a1f3 in g_signal_emit_valist (instance=0x6eb910, signal_id=219, detail=0, var_args=0x7fffffffd058) at gsignal.c:3309
> #16 0x00007ffff3f2a746 in g_signal_emit (instance=0x6eb910, signal_id=219, detail=0) at gsignal.c:3365
> #17 0x00007ffff529d784 in spice_session_channel_destroy (session=0x6eb910, channel=0xa0ada0) at spice-session.c:1990
> #18 0x00007ffff529ed25 in spice_channel_dispose (gobject=0xa0ada0) at spice-channel.c:153
> #19 0x00007ffff52acd26 in spice_display_channel_dispose (object=0xa0ada0) at channel-display.c:136
> #20 0x00007ffff3f1a132 in g_object_unref (_object=0xa0ada0) at gobject.c:3133
> #21 0x00007ffff52a4afb in spice_channel_delayed_unref (data=0xa0ada0) at spice-channel.c:2156
> #22 0x00007ffff3bf21d1 in g_idle_dispatch (source=0xa35a00, callback=0x7ffff52a49f3 <spice_channel_delayed_unref>, user_data=0xa0ada0) at gmain.c:5320
> #23 0x00007ffff3bef8eb in g_main_dispatch (context=0x68a920) at gmain.c:3064
> #24 0x00007ffff3bf0661 in g_main_context_dispatch (context=0x68a920) at gmain.c:3663
> #25 0x00007ffff3bf0853 in g_main_context_iterate (context=0x68a920, block=1, dispatch=1, self=0x6c8c60) at gmain.c:3734
> #26 0x00007ffff3bf0c7c in g_main_loop_run (loop=0x889b20) at gmain.c:3928
> #27 0x00007ffff69be44f in gtk_main () at gtkmain.c:1207
> #28 0x0000000000431896 in main (argc=1, argv=0x7fffffffd648) at remote-viewer-main.c:183
Didn't get the crash here, but got a warning, solved by this patch.
ACK!
> ---
> src/virt-viewer-display-spice.c | 13 -------------
> 1 file changed, 13 deletions(-)
>
> diff --git a/src/virt-viewer-display-spice.c b/src/virt-viewer-display-spice.c
> index e568cfb..6cd8394 100644
> --- a/src/virt-viewer-display-spice.c
> +++ b/src/virt-viewer-display-spice.c
> @@ -58,22 +58,9 @@ static void virt_viewer_display_spice_close(VirtViewerDisplay *display G_GNUC_UN
> static gboolean virt_viewer_display_spice_selectable(VirtViewerDisplay *display);
>
> static void
> -virt_viewer_display_spice_finalize(GObject *obj)
> -{
> - VirtViewerDisplaySpice *spice = VIRT_VIEWER_DISPLAY_SPICE(obj);
> -
> - g_object_unref(spice->priv->display);
> -
> - G_OBJECT_CLASS(virt_viewer_display_spice_parent_class)->finalize(obj);
> -}
> -
> -static void
> virt_viewer_display_spice_class_init(VirtViewerDisplaySpiceClass *klass)
> {
> VirtViewerDisplayClass *dclass = VIRT_VIEWER_DISPLAY_CLASS(klass);
> - GObjectClass *oclass = G_OBJECT_CLASS(klass);
> -
> - oclass->finalize = virt_viewer_display_spice_finalize;
>
> dclass->send_keys = virt_viewer_display_spice_send_keys;
> dclass->get_pixbuf = virt_viewer_display_spice_get_pixbuf;
More information about the virt-tools-list
mailing list