diff options
author | Pavel Grunt <pgrunt@redhat.com> | 2016-07-28 18:55:11 +0200 |
---|---|---|
committer | Pavel Grunt <pgrunt@redhat.com> | 2016-07-28 19:56:47 +0200 |
commit | 85a96f881b72a89fbe301a20565717bf929d3af2 (patch) | |
tree | 995cd74c3910591ee2d237427c8828a6cd1b3db8 | |
parent | a395ac59447dedfb922f997c7c9cff93edd53600 (diff) |
webdav: Do not reuse cancellable
Create it on SPICE_PORT_EVENT_OPENED
From g_cancellable_reset documentation:
Note that it is generally not a good idea to reuse an existing
cancellable for more operations after it has been cancelled once,
as this function might tempt you to do. The recommended practice is
to drop the reference to a cancellable after cancelling it, and let it
die with the outstanding async operations. You should create a fresh
cancellable for further async operations
In our case reusing the cancellable leads to a crash:
#0 0x00007ffff1662940 in g_task_return_error () at /lib64/libgio-2.0.so.0
#1 0x00007ffff1662b60 in g_task_return_new_error () at /lib64/libgio-2.0.so.0
#2 0x00007ffff57916e0 in read_cancelled (cancellable=<optimized out>, user_data=<optimized out>) at vmcstream.c:182
#3 0x00007ffff1391555 in g_closure_invoke () at /lib64/libgobject-2.0.so.0
#4 0x00007ffff13a4062 in signal_emit_unlocked_R () at /lib64/libgobject-2.0.so.0
#5 0x00007ffff13acf5f in g_signal_emit_valist () at /lib64/libgobject-2.0.so.0
#6 0x00007ffff13ad33f in g_signal_emit () at /lib64/libgobject-2.0.so.0
#7 0x00007ffff16100d8 in g_cancellable_cancel () at /lib64/libgio-2.0.so.0
#8 0x00007ffff5775c01 in port_event (self=0xc7af60, event=1) at channel-webdav.c:512
#9 0x00007ffff1391555 in g_closure_invoke () at /lib64/libgobject-2.0.so.0
#10 0x00007ffff13a445d in signal_emit_unlocked_R () at /lib64/libgobject-2.0.so.0
#11 0x00007ffff13acf5f in g_signal_emit_valist () at /lib64/libgobject-2.0.so.0
#12 0x00007ffff577479a in emit_main_context (opaque=0x7fffa5fff8d0) at gio-coroutine.c:200
#13 0x00007ffff10b7847 in g_idle_dispatch () at /lib64/libglib-2.0.so.0
#14 0x00007ffff10bade2 in g_main_context_dispatch () at /lib64/libglib-2.0.so.0
#15 0x00007ffff10bb160 in g_main_context_iterate.isra () at /lib64/libglib-2.0.so.0
#16 0x00007ffff10bb20c in g_main_context_iteration () at /lib64/libglib-2.0.so.0
#17 0x00007ffff1677d2d in g_application_run () at /lib64/libgio-2.0.so.0
#18 0x000000000041031a in main (argc=2, argv=0x7fffffffd928) at remote-viewer-main.c:42
Fixes:
https://bugs.freedesktop.org/show_bug.cgi?id=97113
-rw-r--r-- | src/channel-webdav.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/src/channel-webdav.c b/src/channel-webdav.c index 307a867..0a2ed72 100644 --- a/src/channel-webdav.c +++ b/src/channel-webdav.c @@ -506,7 +506,8 @@ static void port_event(SpiceWebdavChannel *self, gint event) CHANNEL_DEBUG(self, "port event:%d", event); if (event == SPICE_PORT_EVENT_OPENED) { - g_cancellable_reset(c->cancellable); + g_clear_object(&c->cancellable); + c->cancellable = g_cancellable_new(); start_demux(self); } else { g_cancellable_cancel(c->cancellable); @@ -529,7 +530,6 @@ static void spice_webdav_channel_init(SpiceWebdavChannel *channel) channel->priv = c; c->stream = spice_vmc_stream_new(SPICE_CHANNEL(channel)); - c->cancellable = g_cancellable_new(); c->clients = g_hash_table_new_full(g_int64_hash, g_int64_equal, NULL, client_remove_unref); c->demux.buf = g_malloc0(MAX_MUX_SIZE); |