[Spice-devel] [PATCH spice-server 3/5] red-qxl: Avoid using dandling pointers to RedClient

Christophe Fergeau cfergeau at redhat.com
Fri Aug 25 15:38:07 UTC 2017


On Thu, Aug 24, 2017 at 03:37:18PM +0100, Frediano Ziglio wrote:
> A RedClient can be freed from the main thread following
> a main channel disconnection.

I'd mention reds_client_disconnect or some concrete function name so
that someone wanting to follow that code has something to start from.

> 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 disconnecting as disconnection

"when disconnecting"

> is done synchronously (the dispatch messages are registered
> with DISPATCH_ACK).


> 
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
>  server/red-qxl.c    | 6 ++++++
>  server/red-worker.c | 2 ++
>  2 files changed, 8 insertions(+)
> 
> diff --git a/server/red-qxl.c b/server/red-qxl.c
> index 53f3338b..168b9f0d 100644
> --- a/server/red-qxl.c
> +++ b/server/red-qxl.c
> @@ -83,6 +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");
> +    // get a reference potentially the main channel can be destroyed in
> +    // the main thread causing RedClient to be destroyed before using it
> +    g_object_ref(client);
>      payload.client = client;

payload.client = g_object_ref(client); works too.


Acked-by: Christophe Fergeau <cfergeau at redhat.com>

>      payload.stream = stream;
>      payload.migration = migration;
> @@ -141,6 +144,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("");
> +    // get a reference potentially the main channel can be destroyed in
> +    // the main thread causing RedClient to be destroyed before using it
> +    g_object_ref(client);
>      payload.client = client;
>      payload.stream = stream;
>      payload.migration = migration;
> diff --git a/server/red-worker.c b/server/red-worker.c
> index 8fd964ea..fa69da2f 100644
> --- a/server/red-worker.c
> +++ b/server/red-worker.c
> @@ -724,6 +724,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;
> @@ -816,6 +817,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);
>  }
>  
> -- 
> 2.13.5
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel


More information about the Spice-devel mailing list