From d248714439bbe0d3846d58ef27b6925a5a4f3499 Mon Sep 17 00:00:00 2001 From: Frediano Ziglio Date: Thu, 31 Aug 2017 05:05:10 +0100 Subject: [PATCH] red-qxl: Reference RCC pointer in migration request The message is asynchronous so to avoid the object to potentially been released before being processed keep a strong reference to it. Signed-off-by: Frediano Ziglio Acked-by: Christophe Fergeau --- server/red-qxl.c | 4 ++-- server/red-worker.c | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/server/red-qxl.c b/server/red-qxl.c index e145ea49..6ad8f6a5 100644 --- a/server/red-qxl.c +++ b/server/red-qxl.c @@ -130,7 +130,7 @@ static void red_qxl_display_migrate(RedChannelClient *rcc) g_object_get(channel, "channel-type", &type, "id", &id, NULL); dispatcher = (Dispatcher *)g_object_get_data(G_OBJECT(channel), "dispatcher"); spice_printerr("channel type %u id %u", type, id); - payload.rcc = rcc; + payload.rcc = g_object_ref(rcc); dispatcher_send_message(dispatcher, RED_WORKER_MESSAGE_DISPLAY_MIGRATE, &payload); @@ -187,7 +187,7 @@ static void red_qxl_cursor_migrate(RedChannelClient *rcc) g_object_get(channel, "channel-type", &type, "id", &id, NULL); dispatcher = (Dispatcher *)g_object_get_data(G_OBJECT(channel), "dispatcher"); spice_printerr("channel type %u id %u", type, id); - payload.rcc = rcc; + payload.rcc = g_object_ref(rcc); dispatcher_send_message(dispatcher, RED_WORKER_MESSAGE_CURSOR_MIGRATE, &payload); diff --git a/server/red-worker.c b/server/red-worker.c index 6ebe6b94..9c97f499 100644 --- a/server/red-worker.c +++ b/server/red-worker.c @@ -747,6 +747,7 @@ static void handle_dev_display_migrate(void *opaque, void *payload) spice_debug("migrate display client"); spice_assert(rcc); red_migrate_display(worker->display_channel, rcc); + g_object_unref(rcc); } static inline uint32_t qxl_monitors_config_size(uint32_t heads) @@ -828,6 +829,7 @@ static void handle_dev_cursor_migrate(void *opaque, void *payload) spice_debug("migrate cursor client"); cursor_channel_client_migrate(rcc); + g_object_unref(rcc); } static void handle_dev_set_compression(void *opaque, void *payload)