[Spice-commits] server/red-qxl.c server/red-worker.c
Frediano Ziglio
fziglio at kemper.freedesktop.org
Tue Aug 29 15:31:18 UTC 2017
server/red-qxl.c | 8 ++++++--
server/red-worker.c | 2 ++
2 files changed, 8 insertions(+), 2 deletions(-)
New commits:
commit 975d10c9ef5d843764de83f0ecabb1fa8d903124
Author: Frediano Ziglio <fziglio at redhat.com>
Date: Thu Aug 24 14:33:03 2017 +0100
red-qxl: Avoid using dangling pointers to RedClient
A RedClient can be freed from the main thread following a main channel
disconnection (reds_client_disconnect). This can happen while another
thread is allocating a new channel client for that client.
To prevent the usage of a pointer which can be invalid
take ownership of the pointer.
Note that we don't need this when disconnecting as disconnection is
done synchronously (the dispatch messages are registered with
DISPATCH_ACK).
Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
Acked-by: Christophe Fergeau <cfergeau at redhat.com>
diff --git a/server/red-qxl.c b/server/red-qxl.c
index 53f3338b..e145ea49 100644
--- a/server/red-qxl.c
+++ b/server/red-qxl.c
@@ -83,7 +83,9 @@ static void red_qxl_set_display_peer(RedChannel *channel, RedClient *client,
spice_debug("%s", "");
dispatcher = (Dispatcher *)g_object_get_data(G_OBJECT(channel), "dispatcher");
- payload.client = client;
+ // get a reference potentially the main channel can be destroyed in
+ // the main thread causing RedClient to be destroyed before using it
+ payload.client = g_object_ref(client);
payload.stream = stream;
payload.migration = migration;
red_channel_capabilities_init(&payload.caps, caps);
@@ -141,7 +143,9 @@ static void red_qxl_set_cursor_peer(RedChannel *channel, RedClient *client, Reds
RedWorkerMessageCursorConnect payload = {0,};
Dispatcher *dispatcher = (Dispatcher *)g_object_get_data(G_OBJECT(channel), "dispatcher");
spice_printerr("");
- payload.client = client;
+ // get a reference potentially the main channel can be destroyed in
+ // the main thread causing RedClient to be destroyed before using it
+ payload.client = g_object_ref(client);
payload.stream = stream;
payload.migration = migration;
red_channel_capabilities_init(&payload.caps, caps);
diff --git a/server/red-worker.c b/server/red-worker.c
index 7db424c8..0e2e8fa3 100644
--- a/server/red-worker.c
+++ b/server/red-worker.c
@@ -729,6 +729,7 @@ static void handle_dev_display_connect(void *opaque, void *payload)
dcc = dcc_new(display, msg->client, msg->stream, msg->migration, &msg->caps,
worker->image_compression, worker->jpeg_state, worker->zlib_glz_state);
+ g_object_unref(msg->client);
red_channel_capabilities_reset(&msg->caps);
if (!dcc) {
return;
@@ -821,6 +822,7 @@ static void handle_dev_cursor_connect(void *opaque, void *payload)
cursor_channel_connect(worker->cursor_channel,
msg->client, msg->stream, msg->migration,
&msg->caps);
+ g_object_unref(msg->client);
red_channel_capabilities_reset(&msg->caps);
}
More information about the Spice-commits
mailing list