[Spice-devel] [PATCH spice-gtk 5/5] webdav: remove the client if input stream is closed

Victor Toso victortoso at redhat.com
Mon Sep 4 09:29:53 UTC 2017


On Thu, Aug 17, 2017 at 03:35:57PM +0200, marcandre.lureau at redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau at redhat.com>
> 
> Instead of printing a warning when trying to read from a closed
> stream. It can happen that libsoup closes the pipe output stream while
> the input stream had no pending operation, in which case the close is
> successful and we shouldn't try to read from the stream anymore.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau at redhat.com>
> ---
>  src/channel-webdav.c | 17 +++++++++++------
>  1 file changed, 11 insertions(+), 6 deletions(-)
> 
> diff --git a/src/channel-webdav.c b/src/channel-webdav.c
> index 4a246b5..f1b6c2a 100644
> --- a/src/channel-webdav.c
> +++ b/src/channel-webdav.c
> @@ -218,7 +218,7 @@ client_ref(Client *client)
>      return client;
>  }
>  
> -static void client_start_read(Client *client);
> +static bool client_start_read(Client *client);
>  
>  static void remove_client(Client *client)
>  {
> @@ -234,10 +234,9 @@ static void mux_pushed_cb(OutputQueue *q, gpointer user_data)
>  {
>      Client *client = user_data;
>  
> -    if (client->mux.size == 0) {
> +    if (client->mux.size == 0 ||
> +        !client_start_read(client)) {
>          remove_client(client);
> -    } else {
> -        client_start_read(client);
>      }
>  
>      client_unref(client);
> @@ -280,14 +279,18 @@ end:
>      client_unref(client);
>  }
>  
> -static void client_start_read(Client *client)
> +static bool client_start_read(Client *client)
>  {
>      GInputStream *input;
>  
>      input = g_io_stream_get_input_stream(G_IO_STREAM(client->pipe));
> +    if (g_input_stream_is_closed(input)) {
> +        return false;
> +    }
>      g_input_stream_read_async(input, client->mux.buf, MAX_MUX_SIZE,
>                                G_PRIORITY_DEFAULT, client->cancellable, server_reply_cb,
>                                client_ref(client));
> +    return true;
>  }
>  
>  static void start_demux(SpiceWebdavChannel *self);
> @@ -361,6 +364,7 @@ static void start_client(SpiceWebdavChannel *self)
>      SoupServer *server;
>      GSocketAddress *addr;
>      GError *error = NULL;
> +    bool started;
>  
>      session = spice_channel_get_session(SPICE_CHANNEL(self));
>      server = phodav_server_get_soup_server(spice_session_get_webdav_server(session));
> @@ -384,7 +388,8 @@ G_GNUC_END_IGNORE_DEPRECATIONS
>  
>      g_hash_table_insert(c->clients, &client->id, client);
>  
> -    client_start_read(client);
> +    started = client_start_read(client);
> +    g_assert(started);

Isn't it assert too much?

>      demux_to_client(client);
>  
>      g_clear_object(&addr);
> -- 
> 2.14.0.1.geff633fa0
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20170904/4d95e406/attachment.sig>


More information about the Spice-devel mailing list