[Spice-devel] [PATCH spice-server] fixup! Re-arrange channel client creation to avoid exposing client lock
Jonathon Jongsma
jjongsma at redhat.com
Wed Nov 2 19:08:27 UTC 2016
Thanks,
Acked-by: Jonathon Jongsma <jjongsma at redhat.com>
On Tue, 2016-11-01 at 15:37 +0000, Frediano Ziglio wrote:
> Call red_client_add_channel at the end of initialisation.
> This respect the previous order.
> After returning from a successful red_client_add_channel another
> thread could call some function in this RedChannelClient so make sure
> is fully initalized. Not doing so for instance could cause a
> disconnection to a freed RedChannelClient to be scheduled.
>
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
> server/dummy-channel-client.c | 6 ++----
> server/red-channel-client.c | 6 +++---
> 2 files changed, 5 insertions(+), 7 deletions(-)
>
> diff --git a/server/dummy-channel-client.c b/server/dummy-channel-
> client.c
> index a39941c..c602412 100644
> --- a/server/dummy-channel-client.c
> +++ b/server/dummy-channel-client.c
> @@ -44,13 +44,11 @@ static gboolean
> dummy_channel_client_initable_init(GInitable *initable,
> RedClient *client = red_channel_client_get_client(rcc);
> RedChannel *channel = red_channel_client_get_channel(rcc);
>
> + red_channel_add_client(channel, rcc);
> if (!red_client_add_channel(client, rcc, &local_error)) {
> - goto cleanup;
> + red_channel_remove_client(channel, rcc);
> }
>
> - red_channel_add_client(channel, rcc);
> -
> -cleanup:
> if (local_error) {
> g_warning("Failed to create channel client: %s",
> local_error->message);
> g_propagate_error(error, local_error);
> diff --git a/server/red-channel-client.c b/server/red-channel-
> client.c
> index 5a462dc..bfa44b4 100644
> --- a/server/red-channel-client.c
> +++ b/server/red-channel-client.c
> @@ -869,9 +869,6 @@ static gboolean
> red_channel_client_initable_init(GInitable *initable,
> GError *local_error = NULL;
> SpiceCoreInterfaceInternal *core;
> RedChannelClient *self = RED_CHANNEL_CLIENT(initable);
> - if (!red_client_add_channel(self->priv->client, self,
> &local_error)) {
> - goto cleanup;
> - }
>
> if (!red_channel_config_socket(self->priv->channel, self)) {
> g_set_error_literal(&local_error,
> @@ -902,6 +899,9 @@ static gboolean
> red_channel_client_initable_init(GInitable *initable,
> }
>
> red_channel_add_client(self->priv->channel, self);
> + if (!red_client_add_channel(self->priv->client, self,
> &local_error)) {
> + red_channel_remove_client(self->priv->channel, self);
> + }
>
> cleanup:
> if (local_error) {
More information about the Spice-devel
mailing list