[Spice-commits] gtk/channel-usbredir.c

Marc-André Lureau elmarco at kemper.freedesktop.org
Mon Dec 22 04:12:48 PST 2014


 gtk/channel-usbredir.c |    3 +++
 1 file changed, 3 insertions(+)

New commits:
commit 5b252b0f499601bcf387c02a4dd35d27ed34c07c
Author: Marc-André Lureau <marcandre.lureau at redhat.com>
Date:   Sat Dec 20 01:03:09 2014 +0100

    usbredir: prevent crash when calling without host
    
    Quite annoyingly, usbredir doesn't have public functions arguments
    preconditions, and will weirdly run the flush callback during
    initialization.
    
    With 201a8c2 change, the channel state is kept as it is when calling
    reset. This will result in the following crash that was avoided before
    thanks to a precondition on the channel to be ready. Adding a further
    precondition check on priv->host != NULL solves the following crash
    during reset():
    
    Program received signal SIGSEGV, Segmentation fault.
    usbredirhost_write_guest_data (host=0x0) at usbredirhost.c:868
    868                               return
    usbredirparser_do_write(host->parser);
    (gdb) bt
     #0  0x00007fffb2ed24d0 in usbredirhost_write_guest_data (host=0x0) at
     #usbredirhost.c:868
     #1  0x00007fffc81d463b in
     #usbredir_write_flush_callback (user_data=0x2d95250) at
     #channel-usbredir.c:469
     #2  0x00007fffb2ed23f9 in usbredirhost_open_full (usb_ctx=0x2baba70,
     #usb_dev_handle=0x0, log_func=<optimized out>,
     #read_guest_data_func=0x7fffc81d482c <usbredir_read_callback>,
     #write_guest_data_func=0x7fffc81d4952 <usbredir_write_callback>,
     #flush_writes_func=0x7fffc81d45c3 <usbredir_write_flush_callback>,
     #alloc_lock_func=0x7fffc81d49f1 <usbredir_alloc_lock>,
     #lock_func=0x7fffc81d4a41 <usbredir_lock_lock>,
     #unlock_func=0x7fffc81d4a86 <usbredir_unlock_lock>,
     #free_lock_func=0x7fffc81d4acb <usbredir_free_lock>,
     #func_priv=0x2d95250, version=0x7fffc8283dcf "spice-gtk
     #0.27.7-89db-dirty", verbose=4, flags=1) at usbredirhost.c:748
     #3  0x00007fffc81d3b22 in
     #spice_usbredir_channel_set_context (channel=0x2d95250
     #[SpiceUsbredirChannel], context=0x2baba70) at channel-usbredir.c:212
     #4  0x00007fffc81d37a9 in spice_usbredir_channel_reset (c=0x2d95250
     #[SpiceUsbredirChannel], migrating=0)
     at channel-usbredir.c:125
     #5  0x00007fffc81b7f8d in spice_channel_reset (channel=0x2d95250
     [SpiceUsbredirChannel], migrating=0)
     at spice-channel.c:2688
     #6  0x00007fffc81b8057 in channel_disconnect (channel=0x2d95250
     [SpiceUsbredirChannel]) at spice-channel.c:2706
     #7  0x00007fffc81b7559 in
     spice_channel_coroutine (data=0x2d95250) at spice-channel.c:2490

diff --git a/gtk/channel-usbredir.c b/gtk/channel-usbredir.c
index 5238566..b1a91fb 100644
--- a/gtk/channel-usbredir.c
+++ b/gtk/channel-usbredir.c
@@ -466,6 +466,9 @@ static void usbredir_write_flush_callback(void *user_data)
             SPICE_CHANNEL_STATE_READY)
         return;
 
+    if (!priv->host)
+        return;
+
     usbredirhost_write_guest_data(priv->host);
 }
 


More information about the Spice-commits mailing list